孙哥Spring源码第24集

第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

孙哥Spring源码第24集_第1张图片

Cglib

孙哥Spring源码第24集_第2张图片

13、仿写@EnableAspectAutoProxy

14、为什么@EnableAspectAutoProxy用@Import进行包装

语义化

15、@SpringBootApplication包含了那些注解?

  • @Configuration
  • @EnableAutoConfiguration
  • @CompontScan

16、SpringAOP的本质是什么?

BeanPostProcessor AnnotationAwareAspectJAutoProxyCreator
image-20230516001011232

17、创建代理的这个BeanPostProcessor在Spring源码中什么位置执行的?

正常情况是:创建对象 属性填充 初始化的beanPostProcessorAfter【执行】
循环引用的情况是:如果存在循环引用的话,将会在singletonFactories存储的lamba表达式中创建

18、加上@EnableAspectAutoProxy会多几个BeanPostPrcoessor?

孙哥Spring源码第24集_第3张图片

19、代理对象一定会在初始化创建吗?

不一定 循环引用创建 -----> singletonFactrices ----> lamba —> 创建

你可能感兴趣的:(spring,java,后端)