spring aop

    技术2022-07-11  85

    aop引入

    aop(面向切面编程)是oop(面向对象编程)的一个补充,oop关注的是一个类具有的抽象属性和方法,但是在开发中业务类经常被迫需要扩展一些跟核心业务无关的侵入性代码,例如日志打印,方法调用监控,事务管理等功能,若侵入性代码在核心类中添加,则破坏了核心业务类的单一职责的原则,所以为了解耦核心和非核心的代码,aop概念诞生了,aop关注的是切割和整合核心类和非核心类的功能,让其两者无耦合性正常工作来满足业务性功能需求。

    Java中的aop技术

    aop的思想其实是Java源码层面存在的技术,诞生的根源是保持代码的可读性和扩展性,以便减轻后期维护和扩展代码的工作量,当Java文件被编译成JVM可用的Class字节码时,核心业务逻辑和非核心业务逻辑其实也是耦合在一起的,所以aop技术的关键点是修改Class字节码,而修改字节码技术在Java中有三个修改点,一个是编译期采用专门的编译器修改,一个是加载期通过特定的类加载器修改,一个是运行期通过JDK提供的动态代理和cglib代理修改。

    spring关于aop前置专业术语

    通知:非核心业务方法,例如日志打印,事务管理等。 切入点:一个表达式,筛选出容器中需要被增强的方法(核心业务方法)。 Advisor:spring定义的接口,一个Advisor内部封装一个通知和一个切入点。 切面:加了@Aspect注解的类,多个Advisor。

    spring实现aop的关键类

    核心类是AnnotationAwareAspectJAutoProxyCreator,该接口实现了后置处理器(InstantiationAwareBeanPostProcessor),有两个核心方法,代理流程二选一: postProcessBeforeInstantiation: 该方法会提供一个机会给外部应用创建Bean对象,并会为该Bean对象创建一个代理对象。 postProcessAfterInitialization: 该方法会通过spring默认机制创建和初始化Bean对象,并会为该Bean对象创建一个代理对象。

    AnnotationAwareAspectJAutoProxyCreator源码

    aop实现代理主要逻辑: 1.获取所有通知(Advisor),每一个Advisor对应上每一个非核心方法。 2.每一个Advisor都有一个切入点(PointCut),通过Bean名称和切入点为Bean和Advisor建立一个关联关系。 3.Bean和Advisor关联关系是指:Bean中的那些方法需要那些Advisor来增强。 4.创建Bean的代理对象。

    postProcessBeforeInstantiation流程 接口主要逻辑:从图中可看到,通过TargetSource手动创建的Bean对象,都会被spring进行aop代理,代理逻辑有三个,获取外部应用创建的Bean对象,获取Bean可用的通知,创建Bean对象的代理对象。 postProcessAfterInitialization流程 接口主要逻辑:从图中可看到,由spring默认创建的Bean对象,有需要增强的Bean,才会被spring进行aop代理,代理逻辑有两个,获取Bean可用的通知,创建Bean对象的代理对象。 通知源码分析 1.postProcessAfterInitialization()调用wrapIfNecessary() 2.wrapIfNecessary()调用getAdvicesAndAdvisorsForBean() 3.getAdvicesAndAdvisorsForBean()调用findEligibleAdvisors() 4.两个关键方法:获取所有通知,并过滤出当前Bean可用的通知 4.1.findCandidateAdvisors()方法获取所有通知 4.2.findAdvisorsThatCanApply()过滤出当前Bean可用的通知,不做深入研究 5.获取通知的两条线:获取实现了Advisor接口的通知和加了注解@Aspect的通知 5.1.super.findCandidateAdvisors()早期的通知是通过实现Advisor接口来实现的,这里不做扩展。 5.2.aspectJAdvisorsBuilder.buildAspectJAdvisors()获取加了注解@Aspect的通知 6.findCandidateAdvisors()调用aspectJAdvisorsBuilder.buildAspectJAdvisors()

    代理源码分析

    Processed: 0.011, SQL: 9