【Spring】AOP的核心原理配方
引言
>Aop是Spring的另一核心功能,通过动态代理实现功能扩展
文章目录
引言
一、IOC
1.1 组件扫描
1.2 @Import
二、AOP
2.1 基本使用
2.2 接口使用
2.3 源码追踪
三、Transation
3.1 基本配置
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类