您的位置:首页 > 编程语言 > Java开发

Spring AOP

2015-10-16 16:10 549 查看
spring AOP
spring有四种方法级别的增强,包括前置增强、后置增强、环绕增强、异常抛出增强,
有一种特殊的类级别的增强,引介增强

以下是三种不同配置方式,实现自动代理的简要示例:

xml方式配置Advisor匹配:
1先创建增强类XxxAdvice,依据不同增强类型实现不同的接口

2在xml中配置代理工厂ProxyFactoryBean

<!-- 增强类 -->
<bean id="xxxAdvice" class="com.a.b.XxxAdvice"/>

<!-- 目标对象 -->
<bean id="target" class="com.a.b.XxxService"/>

<!-- 代理类 -->
<bean id="xxxService" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"
<!-- 指定使用的增强 -->

p:advice-ref="xxxAdvice"
<!-- 要代理的目标方法匹配的表达式 -->
p:patterns=".*target" />
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
/>

3调用逻辑
获取到代理类对象(注入等方式)
用代理对象调用原目标对象的功能方法

@AspectJ方式配置实例:

1切面类

@Aspect //该注解将该类标注为一个切面
public class PerformanceAspect{
@Around("execution(* com.xxx.*.* (...))")
//表明是环绕增强,在目标类的所有方法上织入,方法可以是任意入参和返回值(根据切点表达式具体控制)
public void xxxX(ProceedingJoinPoint point){
//横切逻辑代码
point.procceed();

//横切逻辑代码
}
}

2在spring xml文件中加入:
<aop:aspectj-autoproxy /> //开启自动代理
//以及切面类的bean配置(可选,或者使用@Compenent)

基于Schema的配置示例:

<bean id="timeRecordLogAspect" class="com.ggg.mmm.utils.timeRecordLog.TimeRecordLogAspect" scope="prototype">
</bean>

<aop:config proxy-target-class="false">
<aop:aspect ref="timeRecordLogAspect">
<aop:around method="getTimeLog" pointcut="execution(* com.ggg.xxx.*.*.impl..*(..))" />
</aop:aspect>
</aop:config>

类似于基于AspectJ配置,切面类的写法也一致(去除@aspectj标注)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: