Spring AOP原理分析
AOP基础概念
目标类(Target)
代理(Proxy)
连接点(Joinpoint)
切点(Pointcut)
通知(Advice):增加的功能
切面(Aspect):切点 + 通知
织入(Weaving):增强目标类的方法
引入(Introduction):增加新方法、属性
Spring AOP使用方式
1、基于代理的AOP
<!-- 切面=通知+切点 -->
<bean id="myAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="advice" ref="myAdvice"/>
<property name="pointcut" ref="myPointcut"/>
</bean>
<!-- 定义代理对象 -->
<bean id="aopProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="targetObject"/>
<property name="interceptorNames" value="myAdvisor"/>
</bean>
2、纯简单Java对象切面
public class MyAdvice implements MethodBeforeAdvice
<bean id ="myAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice" ref="myAdvice"></property>
<property name="pattern" value=".*test"/>
</bean>
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>
3、@Aspect注解形式的
@Aspect @Component public class MyAspect { @Before("pointcut()") public void advice() { System.out.println("before advice"); } @Pointcut("execution(* cn.zj90..*.*(..))") public void pointcut() { } }
<aop:aspectj-autoproxy proxy-target-class="true" />
4、注入形式的Aspcet切面
<aop:config>
<aop:aspect ref="myAspect">
<aop:before method="advice" pointcut="execution(* cn.zj90..*.*(..))"/>
</aop:aspect>
</aop:config>
Spring AOP原理
使用到的类
ProxyFactoryBean
DefaultAopProxyFactory
JdkDynamicAopProxy
ObjenesisCglibAopProxy
JdkDynamicAopProxy
实现了InvocationHandler接口,JDK动态代理的使用如下
Proxy.newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
invoke方法的实现
调用流程
时序图
初始化通知器链,然后获取目标对象的代理,如果目标类实现接口则获取JDK动态代理,否则获取Cglib代理
参考
http://blog.csdn.net/udbnny/article/details/5870076