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

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

上篇文章主要介绍了beanPostProcessor后置处理器如何注册并创建组件的:

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


前两篇文章是创建后置处理器(如:AnnotationAwareAspectJAutoProxyCreator)的过程,这篇文章开始创建bean。

finishBeanFactoryInitialization创建单实例bean。

beanFactory.preInstantiateSingletons通过bean工厂创建单实例bean。


一、遍历容器中所有 bean,依次创建。


getBean->doGetBean->getSingleton获取单实例bean,这些前面两篇文章都介绍过了,直接就看getSingleton。

image.png


二、创建bean


   1、先从缓存中获取当前bean,如果能获取到,说明bean已经被创建过,直接使用,否则再创建;(只要被创建好的bean都会被缓存起来,spring保证单实例)

   AnnotationAwareAspectJAutoProxyCreator会在所有bean创建之前会有一个拦截,InstantiationAwareBeanPostProcessor会调用postProcessBeforeInstantiation方法。

    【AnnotationAwareAspectJAutoProxyCreator会在任何bean创建前尝试返回bean】

   2、createBean()

     【BeanPostProcessor是在对象创建完成初始化前后调用的。】

     【InstantiationAwareBeanPostProcessor在创建对象完成之前用后置处理器判断是否有对象返回】

     1)resolveBeforeInstantiation后置处理器里获取对象直接返回,没有获取到,则调用doCreateBean()。这里面有两个方法分别调用postProcessorBeforeInitialization和postProcessorAfterInitialization。

      2)doCreateBean,真正创建bean流程。


三、源码图解


如图先用resolveBeforeInstantiation缓存中获取bean。

image.png

点进去缓存中获取的方法可以看到,从beanPostProcessor中获取,若有直接返回。若没有从缓存中获取,则正式创建bean,运行doCreateBean方法。开始创建bean之后,就和之前说的那样,先populate组件的信息,在初始化组件,初始化前后会调用postProcessorBeforeInitialization和postProcessorAfterInitialization方法,这两个方法也是循环beanPostProcessor获取组件调用的,并且若遇到null,会直接返回。


image.png

image.png

相关文章
|
1天前
|
安全 Java 开发者
在Spring框架中,IoC和AOP是如何实现的?
【4月更文挑战第30天】在Spring框架中,IoC和AOP是如何实现的?
7 0
|
1天前
|
Java 测试技术 开发者
【亮剑】如何通过自定义注解来实现 Spring AOP,以便更加灵活地控制方法的拦截和增强?
【4月更文挑战第30天】通过自定义注解实现Spring AOP,可以更灵活地控制方法拦截和增强。首先定义自定义注解,如`@MyCustomAnnotation`,然后创建切面类`MyCustomAspect`,使用`@Pointcut`和`@Before/@After`定义切点及通知。配置AOP代理,添加`@EnableAspectJAutoProxy`到配置类。最后,在需拦截的方法上应用自定义注解。遵循保持注解职责单一、选择合适保留策略等最佳实践,提高代码可重用性和可维护性。记得测试AOP逻辑。
|
6天前
|
canal 缓存 关系型数据库
Spring Boot整合canal实现数据一致性解决方案解析-部署+实战
Spring Boot整合canal实现数据一致性解决方案解析-部署+实战
|
6天前
|
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等分布式框架
|
9天前
|
Java 数据库
Javaweb之SpringBootWeb案例之AOP案例的详细解析
Javaweb之SpringBootWeb案例之AOP案例的详细解析
12 0
|
9天前
|
Java Spring
Javaweb之SpringBootWeb案例之AOP通知顺序的详细解析
Javaweb之SpringBootWeb案例之AOP通知顺序的详细解析
7 0
|
9天前
|
Java Spring
Javaweb之SpringBootWeb案例之AOP通知类型的详细解析
Javaweb之SpringBootWeb案例之AOP通知类型的详细解析
6 0
|
9天前
|
Java Spring
Javaweb之SpringBootWeb案例之AOP核心概念的详细解析
Javaweb之SpringBootWeb案例之AOP核心概念的详细解析
7 0