技术干货程序员

Spring技术内幕(二):AOP(一)

2017-04-08  本文已影响0人  WhyNotYue

一,概述


1. 原理:面向切面编程

从关注点中分离出横切关注点,通俗点讲,即将解决特定领域问题的代码从业务逻辑中脱离出来。举个栗子,简单的增删改中一般有事务管理,但事务管理与业务逻辑无关,是一个特定重复的操作,这个时候,我们就可以把事务管理从增删改的业务逻辑中脱离出来。在这里,我们的关注点就是增删改等业务逻辑,横切关注点就是事务管理。


2.1 Advice通知

  1. 作用:
  1. 类型(这里只列举三种)

2.2 Pointcut切点

决定Advice通知应该作用于哪个连接点。


2.3 Advisor通知器

用来结合Advice和Pointcut


二,Spring AOP实现的核心技术


动态代理

这里以JVM的动态代理模式举例


三,建立AopProxy代理对象


1. 设计原理

ProxyFactory相关的类继承关系:


Proxy类继承关系.png

2. 配置ProxyFactoryBean

<!--配置ProxyFactoryBean-->
    <!--1,定义使用的通知器Advisor-->
    <bean id="testAdvisor" class="com.abc.TestAdvisor"/>
    <!--2,定义ProxyFactoryBean-->
    <bean id="testAOP" class="org.springframework.aop.framework.ProxyFactoryBean"/>
    <!--3,设定与AOP实现相关的重要属性-->
    <!--3.1,proxyInterface-->
    <property name="proxyInterfaces"><value>com.test.AbcInterface</value></property>
    <!--3.2,target(目标对象)-->
    <property name="target">
        <bean class="com.abc.TestTarget"/>
    </property>
    <!--3.3,interceptorNames(需要定义的通知器)-->
    <property name="interceptorNames">
        <list><value>testAdvisor</value></list>
    </property>

3. ProxyFactoryBean生成AopProxy代理对象

AopProxy的生成过程:两种方式,依赖JDK或者CGLIB提供的Proxy特性。


AopProxy的生成过程.png

4. JDK生成AopProxy代理对象

// JdkDynamicAopProxy生成Proxy代理对象
    @Override
    public Object getProxy(ClassLoader classLoader) {
        if (logger.isDebugEnabled()) {
            logger.debug("Creating JDK dynamic proxy: target source is " + this.advised.getTargetSource());
        }
        // 1,从advised对象中取得代理对象的代理接口配置
        Class<?>[] proxiedInterfaces = AopProxyUtils.completeProxiedInterfaces(this.advised, true);
        findDefinedEqualsAndHashCodeMethods(proxiedInterfaces);
        // 2,调用JDK生成Proxy
        return Proxy.newProxyInstance(classLoader, proxiedInterfaces, this);
    }

5. CGLIB生成AopProxy代理对象

Cglib2AopProxy生成AopProxy代理对象


CGLIB生成Proxy代理对象.png

配置Enhancer对象,通过Enhancer对象的callback回调设置生成代理对象。其中通过设置DynamicAdvisedInterceptor拦截器来完成AOP功能的。


参考资料:Spring技术内幕(第2版) 计文柯

上一篇 下一篇

猜你喜欢

热点阅读