第24集 处理AOP
【视频来源于:B站up主孙帅suns Spring源码视频】【微信号:suns45】
1、谈一下你对ApplicationContext的理解
BeanFactoryPostProcessors
BeanPostProcessor
1. BDBeanFactoryPostProcessors、BeanPostProcessor作用。
处理BDBeanFactoryPostProcessors
处理对象BeanPostProcessor
2. BeanFactory核心的作用
2.1 对象的查找
父容器
singletonObjects
earlySinglteontObjects
factoryObjects
2.2 对象创建
对象的创建
属性的填充
对象的初始化
2、代理模式和装饰器模式的区别
1. 代理设计模式:通过代理类 为原始类(目标) 增加额外功能。
好处:利于原始类(目标类)维护
2. 代理设计模式 与 装饰器设计模式 区别
注意:从UML图角度 代理设计模式 与 装饰器设计模式 完全一致
区别:
代理设计模式 额外性能功能的增强 动态代理概念(可以通过动态字节码技术 创建 JDK / CGLIB Javasist ASM )
装饰器设计模式 增强的功能 本职功能的增强
3. 装饰器模式:
javaIO流
4. 代理模式:
Spring事务处理
3、Spring AOP的开发的概念
1、原始对象:(目标对象) 【只做核心功能,Service】
2、额外功能:根据运行时机 原始方法 之前 之后 前后 抛出异常的时候
3、切入点 :额外功能增加给那些原始方法,是由切入点决定。
4、切面 =切入点+额外功能
Spring体系 Advisor
AspectJ 注解形式开发AOP Aspect —> @Aspect
4、为什么在SpringBoot中不需要@EnableAspectJAutoProxy
@SpringBootApplication里面有@EnableAutoConfiguration帮忙注入了@EnableAspectJAutoProxy
5、编写一个简单AOP测试案例
6、动态代理JDK和Cglib的区别
- JDK 根据接口 通过动态字节码技术 进行接口的实现 ,既保留原始功能 ,又增加额外功能
- CGLIB 根据原始类 通过动态字节码技术 创建原始类的子类,在子类的对应方法中,既保留原始功能,有增加额外功能
7、spring如何区分JDK和Cglib?
如果没有接口,默认用Cglib
8、如果用接口默认用JDK,能不能改成Cglib?
能
@EnableAspectJAutoProxy(proxyTargetClass = true)
9、如果没有接口默认用Cglib,能不能改成JDK?
手工添加 @EnableApsectJAutoProxy设置
默认覆盖SpringBoot内置 设置
9、Spring中如何把JDK和CGLIB与Spring框架进行整合?
通过BeanPostProcessor Spring负责原始对象的创建 后续通过AnnotationAwareAspectJAutoProxyCreator
对原始对象进行代理的创建
10、SpringBoot中 改代理创建的方式?
手工添加@EnableAspectJAutoProxy(proxyTargetClass=true),
11、Spring和SpringBoot默认代理
Spring默认代理是JDK
SpringBoot默认是Cglib
12、JDK代理测试和CGLIB代理测试
JDK
![image-20230516001754570](https://img-blog.csdnimg.cn/img_convert/b83d8eabcd009bf21935f0899b5ef864.png)
Cglib
![image-20230516001810127](https://img-blog.csdnimg.cn/img_convert/10e37d236b9aafa2cadcbb34b2628716.png)
13、仿写@EnableAspectAutoProxy
![image-20230516001602677](https://img-blog.csdnimg.cn/img_convert/c1962637a53becd7db31b4a51cdec6c2.png)
14、为什么@EnableAspectAutoProxy用@Import进行包装
语义化
15、@SpringBootApplication包含了那些注解?
- @Configuration
- @EnableAutoConfiguration
- @CompontScan
16、SpringAOP的本质是什么?
BeanPostProcessor AnnotationAwareAspectJAutoProxyCreator
17、创建代理的这个BeanPostProcessor在Spring源码中什么位置执行的?
正常情况是:创建对象 属性填充 初始化的beanPostProcessorAfter【执行】
循环引用的情况是:如果存在循环引用的话,将会在singletonFactories存储的lamba表达式中创建
18、加上@EnableAspectAutoProxy会多几个BeanPostPrcoessor?
![image-20230515234539898](https://img-blog.csdnimg.cn/img_convert/0ef6c1105821a70b3bf0c80eddf3c1ca.png)
19、代理对象一定会在初始化创建吗?
不一定 循环引用创建 -----> singletonFactrices ----> lamba —> 创建