【Spring】AOP的核心原理配方


引言

>Aop是Spring的另一核心功能,通过动态代理实现功能扩展

文章目录

引言

一、IOC

[1.1 组件扫描](#1.1 组件扫描)

[1.2 @Import](#1.2 @Import)

二、AOP

[2.1 基本使用](#2.1 基本使用)

[2.2 接口使用](#2.2 接口使用)

[2.3 源码追踪](#2.3 源码追踪)

三、Transation

[3.1 基本配置](#3.1 基本配置)

[3.2 源码追踪](#3.2 源码追踪)


一、IOC

1.1 组件扫描

在开发中,会在配置类中添加@ComponentScan注解去获取指定包下面的bean,下面是使用:

开始源码追踪:

找出所有的BeanDefinitionRegistryPostcessor并优先执行

ClassPathBeanDefinitionScanner的doScan方法之前看多了,作用就是扫描basePackages包下面带有特定@Component注解的类。你会发现它在注入BeanDefinition时指定的beanName如果注解包含name使用改name,否则默认类名的首字母小写,如果前两个字母都大写那么beanName就是类名。

接下来我们回到ConfigurationClassParser类的deProcessConfigurarionClass方法

看完retrieve方法后再回到ConfigurationClassPostProcessor中

通过源码,可以发现@Bean注入的beanName默认就是方法名

1.2 @Import

@Import可以导入下面三种类:

1.普通的配置类;

2.实现ImportSelector接口的类

3.实现ImportBeanDefinitionRegistrar接口的类

二、AOP

2.1 基本使用

或许你会发现,最总通知方法的执行时机在原始方法执行后执行,先于环绕后置方法。

2.2 接口使用

可以通过实现Advice接口实现通知

2.3 源码追踪

先通过xml的自定义命名空间去定位到处理器

可以看到向定义池添加了一个AspectJAwareAdvisorAutoProxyCreator类

可以看见该定义类实现了Bean后处理器

可以看到aop底层通过jdk和cglib这两种方式去创建代理对象

当我们在执行方法debug时,通过f7进入执行方法,会发现进入的时代理对象里面。

三、Transation

3.1 基本配置

3.2 源码追踪

事务的源码需要从refresh刷新容器方法进入

finish的调用链需要一步步进入到真正执行Bean诞生的方法中

这里主要看after方法

定位到AnnotationAwareAspectJAutoProxyCreator类

相关推荐
寻星探路5 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
曹牧8 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
爬山算法8 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty7259 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎9 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
李少兄9 小时前
在 IntelliJ IDEA 中修改 Git 远程仓库地址
java·git·intellij-idea
忆~遂愿9 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
小韩学长yyds9 小时前
Java序列化避坑指南:明确这4种场景,再也不盲目实现Serializable
java·序列化
仟濹9 小时前
【Java基础】多态 | 打卡day2
java·开发语言