美文网首页
Spring AOP的深入理解(一)

Spring AOP的深入理解(一)

作者: chengcongyue | 来源:发表于2019-04-22 09:15 被阅读0次

这几天开发环境换成了Ubuntu,花了很长的时间,从今天开始准备学习Spring AOP相关的部分.
我们知道<aop:aspectj-autoproxy/>在配置文件中配置了,就会支持aop的注解开发

registerBeanDefinitionParser("aspectj-autoproxy", new AspectJAutoProxyBeanDefinitionParser());

我们从这个代码,进入到AOP的研究之中,当我们遇到了aspectj-autoproxy,这个时候就对应着注册了AspectJAutoProxyBeanDefinitionParser(),然后我们就研究一下这个类.(在解析配置文件之后,一旦遇到了aspectj-autoproxy,就会调用AspectJAutoProxyBeanDefinitionParser),然后我们进入到,这个类中

public BeanDefinition parse(Element element, ParserContext parserContext) {
        AopNamespaceUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(parserContext, element);
        extendBeanDefinition(element, parserContext);
        return null;
    }

其中最重要的就是第一句代码registerAspectJAnnotationAutoProxyCreatorIfNecessary,然后我们进入到这个之中

public static BeanDefinition registerAspectJAnnotationAutoProxyCreatorIfNecessary(
            BeanDefinitionRegistry registry, @Nullable Object source) {

        return registerOrEscalateApcAsRequired(AnnotationAwareAspectJAutoProxyCreator.class, registry, source);
    }

这个时候就出现了,第一个重要的类AnnotationAwareAspectJAutoProxyCreator.在解析xml文件中,读取到了aspectj-autoproxy,然后就会注册或者升级AnnotationAwareAspectJAutoProxyCreator,这个类的作用大概就是书中说的.
AOP的实现都是通过AnnotationAwareAspectJAutoProxyCreator来实现的,它会根据@Point定义的切点来来自动代理相匹配的bean
按我自己的理解,AnnotationAwareAspectJAutoProxyCreator这个类的作用就是根据注解的切点表达式来自动代理匹配上的bean.
这是第一个需要注意的点,我们回到解析自定义标签的核心代码位置

public static void registerAspectJAutoProxyCreatorIfNecessary(
            ParserContext parserContext, Element sourceElement) {

        BeanDefinition beanDefinition = AopConfigUtils.registerAspectJAutoProxyCreatorIfNecessary(
                parserContext.getRegistry(), parserContext.extractSource(sourceElement));
        useClassProxyingIfNecessary(parserContext.getRegistry(), sourceElement);
        registerComponentIfNecessary(beanDefinition, parserContext);
    }

我们已经实现了第一步,也就是以上代码中的第一步,注册或者升级AnnotationAwareAspectJAutoProxyCreator.有了这个类就可以通过注解的切点表达式来生成代理类.
然后我们看一下第二段代码

  useClassProxyingIfNecessary(parserContext.getRegistry(), sourceElement);

处理proxy-target-class以及expose-proxy属性.然后我们来理解一下这两个属性
proxy-target-class:Spring Aop部分使用JDK动态代理或者cglib代理来为对象创建代理.(尽量使用JDK的动态代理).如果一个对象实现了至少一个借口,此时就会使用JDK动态代理.若对象中没有实现任何的接口,此时就会使用cglib代理.使用cglib代理需要考虑两种情况
无法通知final方法,因为这种方法不能被复写.
你需要讲cglib二进制发型包放在classpath下面.
强制使用cglib代理需要将<aop:config>的proxy-target-class属性设为true.
我们来看一下jdk动态代理和cglib代理的区别:
JDK动态代理:代理的对象必须是某个接口的实现,它是通过在运行期间创建一个接口的实现类完成对目标对象的代理.
cglib代理:针对的是运行期间扩展的子类.它底层是依靠ASM操作字节码实现的,性能比jdk要强.
然后我们来学习一个expose-proxy的作用:
有时候目标对象的内部的自我调用无法实施切面的增强:

public interface A
{
public void A();public void B();
}
@Service
public interface Aimp implements AService
{
@Transactional(.....)
public void a()
{ this.b();
}
@Transactional(.....)
public void b()
{ System.out.println("");
}
}

这种情况下,b下的增强就不会起作用,这个时候要将expose-proxy设为true,然后b修改为


图片.png

截图的形式,就可以实现代理的创建了.

这个时候,为AOP的准备工作就完成了,然后我们要研究的就是如何创建一个增强了.

相关文章

  • Spring 学习--AOP

    参考文献:深入浅析Spring 的aop实现原理Spring AOP 深入剖析AOP: 面向切面编程oop是从上往...

  • 深入理解spring AOP

    Spring AOP详解 一.前言在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一...

  • Spring AOP的深入理解(一)

    这几天开发环境换成了Ubuntu,花了很长的时间,从今天开始准备学习Spring AOP相关的部分.我们知道 在配...

  • 【spring源码实践】spring的核心jar

      实践一门技术的最好方式就是深入理解它的思想,然后造一个出来! Spring AOP:Spring的面向切面编程...

  • 深入理解spring的AOP

    AOP的原理 AOP的实现有两种方式,一种是使用代理,一种是直接修改.class(即使用CGLib等类库)。 问题...

  • Spring AOP (三) CGLIB 动态代理

    在深入理解之前,我们先来看一个简单的例子。 首先,导入 CGLIB 的 Maven 依赖。 Spring AOP ...

  • Spring 讲解(六)

    如何理解 Spring 中的 AOP 一、AOP 的概述 AOP(Aspect Oriented Programm...

  • 五、AOP的定义和原理

    一、本课目标 理解Spring AOP的原理 掌握Spring AOP的七个术语 二、面向切面编程(AOP) 在上...

  • Spring AOP 增强框架 Nepxion Matrix 详

    文章来源公众号:方志朋在《深入聊一聊 Spring AOP 实现机制》一文中,介绍了 Spring AOP 的多种...

  • 深入探究Java动态代理

    深入探究Java动态代理 提起Java的动态代理,大家首先就会想到Spring的AOP,Spring在实现AOP的...

网友评论

      本文标题:Spring AOP的深入理解(一)

      本文链接:https://www.haomeiwen.com/subject/ejsegqtx.html