Spring AOP原理分析

谁都会走 提交于 2020-03-14 10:03:42

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!