【笔记】Spring源码深度解析-3(AOP)

AOP

动态AOP自定义标签

如果声明了自定义的注解,那么就一定会在程序中的某个地方注册了对应的解析器。

AopNamespaceHandler类
AspectJAutoProxyBeanDefinitionParser类
parse方法
registerAspectJAnnotationAutoProxyCreatorIfNecessary方法

注册或升级AnnotationAwareAspectJAutoProxyCreator

所有解析器,都是对BeanDefinitionParser接口的统一实现,入口都是从parse函数开始的
proxy-target-class=true 使用CGLIB代理;expose-proxy(有时候目标对象内部的自我调用将无法实现切面中的增强)=true 进行事务增强

public static void registerAspectJAnnotationAutoProxyCreatorIfNecessary(
			ParserContext parserContext, Element sourceElement) {
		//1、注册或升级AopProxyCreator
		BeanDefinition beanDefinition = AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(
				parserContext.getRegistry(), parserContext.extractSource(sourceElement));
		//2、对proxy-target-class以及expose-proxy属性的处理
		useClassProxyingIfNecessary(parserContext.getRegistry(), sourceElement);
		//3、注册并通知,便于监听器做进一步处理
		registerComponentIfNecessary(beanDefinition, parserContext);
	}

创建AOP代理

AnnotationAwareAspectJAutoProxyCreator实现了BeanPostProcessor接口,而在实现BeanPostProcessor后,当Spring加载Bean时会在实例化之前调用其postProcesserAfter,查看AbstractAutoProxyCreator父类的postProcessAfterInitialization()方法,AOP逻辑的分析由此开始

如果bean适合被代理
如果有增强方法创建代理
获取增强方法创建代理
postProcessAfterInitialization
wrapIfNecessary方法
getAdvicesAndAdvisorsForBean方法
createProxy方法
  • 真正创建代理主要包括两个步骤
    • 获取增强方法或增强器
    • 根据获取的增强进行代理
指定bean的增强方法的获取
获取所有的增强
寻找所有增强中适用于bean的增强并应用
getAdvicesAndAdvisorsForBean方法
findEligibleAdvisors方法
findCandidateAdvisors方法
findAdvisorsThatCanApply方法

获取增强器

使用注解, findCandidateAdvisors的实现是由AnnotationAwareAspectJAutoProxyCreator类完成的;

aspectJAdvisorsBuilder
最繁杂的是增强器获取
findCandidateAdvisors方法
buildAspectJAdvisors方法
getAdvisors方法

buildAspectJAdvisors方法执行逻辑:
在这里插入图片描述

  • 普通增强器的获取
普通增强器的获取
切点信息的获取
根据切点信息生成增强
获取方法上的注解
获取指定方法上的注解并用AspectJAnnotation封装
getAdvisors方法
getAdvisor方法
getPointcut方法
InstantiationModelAwarePointcutAdvisorImpl构造方法
findAspectJAnnotationOnMethod方法
findAnnotation方法
instantiateAdvice方法
getAdvicegetAdvice方法
  • 增加同步实例化增强器
    • 如果寻找的增强器 不为空而且又配置了增强延迟初始化,那么就需要在首位加入同步实例化增强器。同步实例化增强器 SyntheticInstantiationAdvisor
  • 获取DeclareParents注解

寻找匹配的增强器

寻找适合当前class增强器
findAdvisorsThatCanApply
canApply

创建代理

  • createProxy对ProxyFactory做一些初始化操作,为真正创建代理做准备;
    在这里插入图片描述
createProxy方法
getProxy方法

创建AOP静态代理

是指在虚拟机启动时通过改变目标对象字节码分方式来完成对目标对象的增强。

Instrumentation使用

  • jdk1.5引入了java.lang.instrument,自定义实现一个Java agent,通过agent来修改一个类的字节码即改变一个类;
  • 自定义ClassFileTransformerl类
  • 详细(转载)

自定义标签

registerBeanDefinitionParser(“load-time-weaver”, new LoadTimeWeaverBeanDefinitionParser());

织入

参考书籍《Spring源码深度解析》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值