AOP源码解析(2)---Spring源码从入门到精通(十九)

简介: AOP源码解析(2)---Spring源码从入门到精通(十九)

上篇文章主要讲了AOP的@EnableAspectAutoProxy注解,里面导入的类和执行的后置处理器:

AOP源码解析(1)---Spring源码从入门到精通(十八)


阅读本篇文章,一定要先阅读上篇文章,运行的源码是基于上篇文章的代码,才方便理解,如果跳着阅读,感觉内容生涩,概不负责。

1、首先传入配置类到annocationConfigApplicationContext,创建ioc容器。

2、之后注册配置类,调用refresh(),刷新容器。

3、registerBeanPostProcessor方法注册bean后置处理器,来拦截bean的创建。

1)、先按类型获取ioc容器中beanPostProcessor所有的组件。

2)、给容器中加别的BeanPostProcessor。

3)、优先注册实现PriorityOrdered接口的BeanPostProcessor。

4)、next给容器中注册实现ordered接口的beanPostProcessor。

5)、注册没实现优先级接口的BeanPostProcessor。

6)、注册BeanPostProcessor,就是创建此对象,放入IOC容器。


那么如何创建internalAutoProxyCreator类型的对象[AnnotationAwareAspectJAutoProxyCreator]?

创建bean的实例。

Populate()bean填充赋值。

Initializetion初始化bean(流程):

invokeAwareMethods调用aware方法,处理实现aware接口的方法回调。

applyBeanPostProcessorBeforeInitialazation方法里的postProcessBeforeInitialization,后置处理器的调用。

invokeInitMethods执行初始化方法。(@Bean注解指定初始化类)

applyBeanPostProcessorAfterInitialazation方法里的postProcessAfterInitialization,后置处理器的调用。

beanPostProcessor(例子:AnnotationAwareAspectJAutoProxyCreator)创建成功。

7)、吧BeanPostProcessor注册到BeanFactory中。


debugger代码可以看到:


一、下图可以看到,AnnocationConfigApplicationContext调用refresh()刷新。

image.png


二、点进去之后,有registerBeanPostProcessors方法,从注解可以看到,是注册组件后置处理器,拦截组件创建。

image.png

三、点进registerBeanPostProcessors方法,通过类型getBeanNamesForType获取到了internalAutoProxyCreator,这个组件就是在@EnableAspectJAutoProxy注解的,里面AspectJAutoProxyRegietrar类创建的组件。通过internalAutoProxyCreator定义信息,创建AnnotationAwareAspectJAutoProxyCreator组件。


四、然后用addBeanPostProcessor添加后置处理器。


五、下面建立了两个beanPsotProcessor的list集合,从注解可以看到,分离separate分别继承了PriorityOrdered,ordered,和the rest的组件。

image.png

六、吧前面的list遍历,用beanFactory.getBean获取bean。

image.png

七、点进去之后可以看到createBean方法,是不是很熟悉,之前文章讲的bean生命周期就是调用这个方法。

image.png

八、  点进doCreateBean方法,可以看到调用populate填充赋值beanPostProcess,之后再调用initializaebean方法。

image.png

九、点进去可以看到invokeAwareMethods,调用aware方法。

分别在invokeInitMethods初始化bean之前,调用postProcessBeforeInitialization方法,和初始化之后调用postProcessAfterInitialization方法,里面都是循环ioc容器里beanPostProcessrs,存在则后置处理器则调用,若为null,则直接返回。

image.png

十、invokeAwareMethods里面可以看到,判断当前bean是否是实现了aware,根据实现的不同,setBeanFactory,这时候就开始调用setBeanFactory。

image.png

十一、super调用父类的setBeanFactory,到了这一步,就到了我们 上篇文章说的setBeanFactory类这里。

image.png

相关文章
|
7天前
|
Java 应用服务中间件 Nacos
Spring Cloud 常用各个组件详解及实现原理(附加源码+实现逻辑图)
Spring Cloud 常用各个组件详解及实现原理(附加源码+实现逻辑图)
21 0
|
23小时前
|
Java 测试技术 开发者
【亮剑】如何通过自定义注解来实现 Spring AOP,以便更加灵活地控制方法的拦截和增强?
【4月更文挑战第30天】通过自定义注解实现Spring AOP,可以更灵活地控制方法拦截和增强。首先定义自定义注解,如`@MyCustomAnnotation`,然后创建切面类`MyCustomAspect`,使用`@Pointcut`和`@Before/@After`定义切点及通知。配置AOP代理,添加`@EnableAspectJAutoProxy`到配置类。最后,在需拦截的方法上应用自定义注解。遵循保持注解职责单一、选择合适保留策略等最佳实践,提高代码可重用性和可维护性。记得测试AOP逻辑。
|
1天前
|
设计模式 安全 Java
【初学者慎入】Spring源码中的16种设计模式实现
以上是威哥给大家整理了16种常见的设计模式在 Spring 源码中的运用,学习 Spring 源码成为了 Java 程序员的标配,你还知道Spring 中哪些源码中运用了设计模式,欢迎留言与威哥交流。
|
5天前
|
存储 NoSQL Redis
Redis入门到通关之数据结构解析-SkipList
Redis入门到通关之数据结构解析-SkipList
21 0
|
5天前
|
存储 NoSQL 安全
Redis入门到通关之数据结构解析-动态字符串SDS
Redis入门到通关之数据结构解析-动态字符串SDS
12 0
|
5天前
|
存储 NoSQL Java
Redis入门到通关之数据结构解析-Dict
Redis入门到通关之数据结构解析-Dict
12 2
|
5天前
|
canal 缓存 关系型数据库
Spring Boot整合canal实现数据一致性解决方案解析-部署+实战
Spring Boot整合canal实现数据一致性解决方案解析-部署+实战
|
5天前
|
XML 人工智能 Java
Spring Bean名称生成规则(含源码解析、自定义Spring Bean名称方式)
Spring Bean名称生成规则(含源码解析、自定义Spring Bean名称方式)
|
7天前
|
Java Nacos 开发者
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
|
7天前
|
Dubbo Java 应用服务中间件
Java从入门到精通:3.2.2分布式与并发编程——了解分布式系统的基本概念,学习使用Dubbo、Spring Cloud等分布式框架
Java从入门到精通:3.2.2分布式与并发编程——了解分布式系统的基本概念,学习使用Dubbo、Spring Cloud等分布式框架

推荐镜像

更多