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

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 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

相关文章
|
20天前
|
搜索推荐 Java Spring
Spring Filter深度解析
【10月更文挑战第21天】Spring Filter 是 Spring 框架中非常重要的一部分,它为请求处理提供了灵活的控制和扩展机制。通过合理配置和使用 Filter,可以实现各种个性化的功能,提升应用的安全性、可靠性和性能。还可以结合具体的代码示例和实际应用案例,进一步深入探讨 Spring Filter 的具体应用和优化技巧,使对它的理解更加全面和深入。
|
6天前
|
XML Java 数据安全/隐私保护
Spring Aop该如何使用
本文介绍了AOP(面向切面编程)的基本概念和术语,并通过具体业务场景演示了如何在Spring框架中使用Spring AOP。文章详细解释了切面、连接点、通知、切点等关键术语,并提供了完整的示例代码,帮助读者轻松理解和应用Spring AOP。
Spring Aop该如何使用
|
1天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
9 2
|
27天前
|
存储 缓存 Java
Spring高手之路23——AOP触发机制与代理逻辑的执行
本篇文章深入解析了Spring AOP代理的触发机制和执行流程,从源码角度详细讲解了Bean如何被AOP代理,包括代理对象的创建、配置与执行逻辑,帮助读者全面掌握Spring AOP的核心技术。
33 3
Spring高手之路23——AOP触发机制与代理逻辑的执行
|
12天前
|
Java Spring
[Spring]aop的配置与使用
本文介绍了AOP(面向切面编程)的基本概念和核心思想。AOP是Spring框架的核心功能之一,通过动态代理在不修改原代码的情况下注入新功能。文章详细解释了连接点、切入点、通知、切面等关键概念,并列举了前置通知、后置通知、最终通知、异常通知和环绕通知五种通知类型。
24 1
|
8天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
14 0
|
1月前
|
Java Spring
Spring底层架构源码解析(三)
Spring底层架构源码解析(三)
104 5
|
1月前
|
XML Java 数据格式
Spring底层架构源码解析(二)
Spring底层架构源码解析(二)
|
28天前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
62 0
|
1月前
|
XML Java 数据格式
手动开发-简单的Spring基于注解配置的程序--源码解析
手动开发-简单的Spring基于注解配置的程序--源码解析
45 0

推荐镜像

更多