Spring Aop

三种方式:ProxyFactoryBean,BeanNameAutoProxyCreator,基于标签或注解形式
1、ProxyFactoryBean
只能代理一个类
targetBean  interceptorNames     proxyInterfaces
它是一个FactoryBean,通过getObject来获取目标对象生成代理对象所用的工具是AopProxy.getProxy。两种实现类:
JdkDynamicAopProxy     Cglib2AopProxy
前者是通过JDK的动态代理接口做的。
Proxy.newProxyInstance(loader, interfaces, InvocationHandler)
JdkDynamicAopProxy实现InvocationHandler
invoke(proxy, method, args) {
     new *MethodInvocation(proxy, target, method, interceptors).proceed()
}
 
Spring的拦截器需要实现aopalliance的接口,要么直接实现MethodInterceptor,要么实现MethodBeforeAdvice,AfterReturningAdvice,ThrowsAdvice。因为这三种会有对应的MethodBeforeAdviceAdapter,AfterReturningAdviceAdapter,ThrowsAdviceAdapter作为适配器,如果配上了,会分别用MethodBeforeAdviceInterceptor,AfterReturningAdviceInterceptor,ThrowsAdviceInterceptor包装advice对象成为MethodInterceptor类型。
 
aopalliance接口结构图
。。。。。。。
 
2、BeanNameAutoProxyCreator
能通过beanNames匹配来生成代理对象,是批量的
beanNames     interceptorNames
 
它是一个BeanPostProcessor,在每个Bean实例化完并且初始化完成之后,会触发这个后置处理器的postProcessAfterInitialization(bean, beanName),如果匹配上beanNames,就会返回一个代理。所用的还是AopProxy,即JdkDynamicAopProxy或Cglib2AopProxy
 
3、基于标签或注解的形式
标签:
<aop:config>                      表示提供对xml声明式Aop支持            后置处理器为AspectJAwareAdvisorAutoProxyCreator
<aop:aspectj-autoproxy>     表示提供对@Aspectj注解式Aop支持   后置处理器为AnnotationAwareAspectjAutoProxyCreator
<aop:aspectj-autoproxy proxy-target-class="false" >表示用JdkDynamicAopProxy来创建(如果没有接口,还是用Cglib)
 
<bean id="**MethodInterceptor">
<aop:config>
     <aop:pointcut id="p1" expression="execution( *com.xussen.Service.save*(..))">
     <aop:advisor pointcut-ref="p1" advice-ref="**MethodInterceptor">
</aop:config>
<aop:config>
     <aop:aspect id="" ref="aspect对象">
          <aop:pointcut id="" expression="">
          <aop:before method="" pointcut-ref="">
          <aop:after method="" pointcut-ref="">
     </aop:aspect>
</aop:config>
注解:
@Aspectj
class AspectAdvice {
     @Pointcut("execution( *com.xussen.*Server.save*(..) || 。。。)")
     anyMethod(){}
 
     @Before("anyMethod")
     doBefore(JointPoint){...}
 
     @AfterReturning(value="anyMethod", returning="result")
     doAfterReturning(JointPoint, String result){...}
}
 

你可能感兴趣的:(AOP)