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

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

相关文章
|
19天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
38 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
16天前
|
Java 数据库连接 数据库
从入门到精通---深入剖析Spring DAO
在Java企业级开发中,Spring框架以其强大的功能和灵活性,成为众多开发者的首选。Spring DAO(Data Access Object)作为Spring框架中处理数据访问的重要模块,对JDBC进行了抽象封装,极大地简化了数据访问异常的处理,并能统一管理JDBC事务。本文将从概述、功能点、背景、业务点、底层原理等多个方面深入剖析Spring DAO,并通过多个Java示例展示其应用实践,同时指出对应实践的优缺点。
21 1
|
20天前
|
监控 安全 Java
什么是AOP?如何与Spring Boot一起使用?
什么是AOP?如何与Spring Boot一起使用?
46 5
|
20天前
|
监控 Java 数据安全/隐私保护
如何用Spring Boot实现拦截器:从入门到实践
如何用Spring Boot实现拦截器:从入门到实践
38 5
|
21天前
|
前端开发 Java 开发者
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
64 2
|
21天前
|
前端开发 Java Spring
探索Spring MVC:@Controller注解的全面解析
在Spring MVC框架中,`@Controller`注解是构建Web应用程序的基石之一。它不仅简化了控制器的定义,还提供了一种优雅的方式来处理HTTP请求。本文将全面解析`@Controller`注解,包括其定义、用法、以及在Spring MVC中的作用。
40 2
|
22天前
|
前端开发 Java Maven
深入解析:如何用 Spring Boot 实现分页和排序
深入解析:如何用 Spring Boot 实现分页和排序
46 2
|
21天前
|
前端开发 Java 开发者
Spring MVC中的控制器:@Controller注解全解析
在Spring MVC框架中,`@Controller`注解是构建Web应用程序控制层的核心。它不仅简化了控制器的定义,还提供了灵活的请求映射和处理机制。本文将深入探讨`@Controller`注解的用法、特点以及在实际开发中的应用。
55 0
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
71 2
|
2月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
76 0

推荐镜像

更多
下一篇
DataWorks