spring 直接使用ProxyFactoryBean 实现AOP 流程小结
2017-05-07 22:26
716 查看
ProxyFactoryBean 是最原始的实现Spring AOP配置的方式
实例:
实例化过程主要类:
1.ProxyFactoryBean
2.RegexpMethodPointcutAdvisor
3.DefaultAopProxyFactory
4.JdkDynamicAopProxy+ObjenesisCglibAopProxy
1.ProxyFactoryBean 继承FactoryBean接口,getObject()方法在实例化bean的时候被调用,返回值为代理对象
a. getObject()方法首先initializeAdvisorChain(); 将RegexpMethodPointcutAdvisor添加至ProxyFactoryBean的advisors
b. 非prototype时调用getSingletonInstance();将自己作为参数传给DefaultAopProxyFactory.createAopProxy(AdvisedSupport config)去创建代理对象。
2.DefaultAopProxyFactory 根据传输的AdvisedSupport的一些条件判定采用ObjenesisCglibAopProxy(AdvisedSupport config)还是JdkDynamicAopProxy(AdvisedSupport config)
3.JdkDynamicAopProxy 继承自 AopProxy接口的getProxy()方法被调用,Proxy.newProxyInstance(classLoader, proxiedInterfaces, this).其中this就是当前的JdkDynamicAopProxy(继承自InvocationHandler.).需要注意的是,JdkDynamicAopProxy持有了ProxyFactoryBean对象,间接的拥有了advisors,target.
4.ObjenesisCglibAopProxy 与3类似,实现是基于cglib
运行过程主要接口:
1.MethodInterceptor(实现类com.daodao.mybatis.testAOPAdvice)
2.MethodInvocation(实现类ReflectiveMethodInvocation)
1. JdkDynamicAopProxy 的invoke(Object proxy, Method method, Object[] args)会调用ReflectiveMethodInvocation.proceed();来处理整个流程
a.ReflectiveMethodInvocation 最终目的是将增强逻辑依次插入到现有方法实现的前后。其过程是先调用所有的MethodInterceptor的invoke(MethodInvocation invocation),该方法在实现中又会调用invocation.proceed();,直到所有的advice跑完,将会调用target的原有方法。是个递归调用。
总结:
仅对JDK动态代理来说,就是将所有的MethodInterceptor实现类和target被代理的类交给InvocationHandler,在InvocationHandler的invoke(Object proxy, Method method, Object[] args)调用中嵌套调用最终跑完所有的MethodInterceptor的invoke(MethodInvocation invocation)以及target的原本方法。
实例:
<bean id="testDaoService" class="com.daodao.mybatis.testDaoService"/> <bean id="testAOPAdvice" class="com.daodao.mybatis.testAOPAdvice"/> <bean id="regexpAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor" p:advice-ref="testAOPAdvice"> <property name="patterns"> <list> <value>com\.daodao\.mybatis\..*</value> </list> </property> </bean> <bean id="aoptest1" class="org.springframework.aop.framework.ProxyFactoryBean" p:interceptorNames="regexpAdvisor" p:target-ref="testDaoService" p:proxyTargetClass="true"/>
实例化过程主要类:
1.ProxyFactoryBean
2.RegexpMethodPointcutAdvisor
3.DefaultAopProxyFactory
4.JdkDynamicAopProxy+ObjenesisCglibAopProxy
1.ProxyFactoryBean 继承FactoryBean接口,getObject()方法在实例化bean的时候被调用,返回值为代理对象
a. getObject()方法首先initializeAdvisorChain(); 将RegexpMethodPointcutAdvisor添加至ProxyFactoryBean的advisors
b. 非prototype时调用getSingletonInstance();将自己作为参数传给DefaultAopProxyFactory.createAopProxy(AdvisedSupport config)去创建代理对象。
2.DefaultAopProxyFactory 根据传输的AdvisedSupport的一些条件判定采用ObjenesisCglibAopProxy(AdvisedSupport config)还是JdkDynamicAopProxy(AdvisedSupport config)
3.JdkDynamicAopProxy 继承自 AopProxy接口的getProxy()方法被调用,Proxy.newProxyInstance(classLoader, proxiedInterfaces, this).其中this就是当前的JdkDynamicAopProxy(继承自InvocationHandler.).需要注意的是,JdkDynamicAopProxy持有了ProxyFactoryBean对象,间接的拥有了advisors,target.
4.ObjenesisCglibAopProxy 与3类似,实现是基于cglib
运行过程主要接口:
1.MethodInterceptor(实现类com.daodao.mybatis.testAOPAdvice)
2.MethodInvocation(实现类ReflectiveMethodInvocation)
1. JdkDynamicAopProxy 的invoke(Object proxy, Method method, Object[] args)会调用ReflectiveMethodInvocation.proceed();来处理整个流程
a.ReflectiveMethodInvocation 最终目的是将增强逻辑依次插入到现有方法实现的前后。其过程是先调用所有的MethodInterceptor的invoke(MethodInvocation invocation),该方法在实现中又会调用invocation.proceed();,直到所有的advice跑完,将会调用target的原有方法。是个递归调用。
总结:
仅对JDK动态代理来说,就是将所有的MethodInterceptor实现类和target被代理的类交给InvocationHandler,在InvocationHandler的invoke(Object proxy, Method method, Object[] args)调用中嵌套调用最终跑完所有的MethodInterceptor的invoke(MethodInvocation invocation)以及target的原本方法。
相关文章推荐
- Spring源码阅读-使用ProxyFactoryBean实现AOP
- Spring学习笔记 —— AOP(面向切面编程) 之使用ProxyFactoryBean实现AOP
- spring aop(五)--ProxyFactoryBean创建代理的实现
- Spring的AOP实现方式—ProxyFactoryBean配置方式实现源码剖析
- 使用spring的ProxyFactoryBean来实现权限控制
- Spring源码分析之ProxyFactoryBean方式实现Aop功能的分析
- Spring AOP实现机制(二)--ProxyFactoryBean---将Spring AOP和Spring IoC容器相结合
- Spring ProxyFactoryBean 是如何实现所有的AOP proxy都有可能转为Advised接口的?
- Spring事务——使用TransactionProxyFactoryBean创建事务代理
- 用TransactionProxyFactoryBean实现spring的声明式事务
- Spring AOP-编程的方式创建代理类(ProxyFactoryBean)
- 用TransactionProxyFactoryBean实现spring的声明式事务
- 15_传智播客Spring2.5视频教程_使用JDK中的Proxy技术实现AOP功能 3
- spring学习小结8-使用factoryBean来配置bean
- 使用ProxyFactoryBean创建AOP代理 - Spring Framework reference 2.0.5 参考手册中文版
- Spring -- org.springframework.aop.framework.ProxyFactoryBean
- spring使用TransactionProxyFactoryBean配置事务
- 15_传智播客Spring2.5视频教程_使用JDK中的Proxy技术实现AOP功能 2
- Spring源代码分析(10)---ProxyFactoryBean(旁敲侧击的AOP时代终于来临)
- ITCAST视频-Spring学习笔记(使用JDK中的Proxy技术实现AOP功能)