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标注)