推断构造函数的回调就是通过SmartInstantiationAwareBeanPostProcessor#determineCandidateConstructors
方法来做的!SmartInstantiationAwareBeanPostProcessor是BeanPostProcessor里面的一个子类,它对原有的接口进行增加,增加determineCandidateConstructors方法,再创建对象之前会回调这个方法,推断出未来创建对象的时候可能要需要的构造方法!事实上!这里也会进行注解@Lookup
的解析,后面的学习也会说到,这里不重点说!
Spring默认的实现是: AutowiredAnnotationBeanPostProcessor
它是默认寻找加了@Autowired
注解的构造方法,这里就不细说了,后面会有专门的篇章来介绍Spring的构造方法推断!
我们自己也可以基于这个扩展点去扩展Spring,使得Spring再创建对象前拥有更多的可能性!
扩展点:实现AutowiredAnnotationBeanPostProcessor
接口复写determineCandidateConstructors
方法来控制准备使用的构造函数!
二、解析你的各类Spring注解
java在创建对象完成后,理所应当就是应该去开始向对象注入属性,但是有一点,在注入属性的时候就必须要知道一件事,就是那个属性需要注入!
所以Spring为了方便起见,在注入属性之前我就把你对象里面未来要操作的属性给解析了,然后保存起来,未来进行对象属性注入或其他操作的时候就不需要在进行解析了,直接从缓存中取,也从测面体现了设计模式中职责单一的特点!
对于@Autowired
,@Value
的解析是由BeanPostProcessor
的子类MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition
来做的!
在创建完成对象之后,填充对象之前会 进行这一步操作,Spring内置了一个AutowiredAnnotationBeanPostProcessor
的实现,他的主要作用是用于解析注解@Value、@Autowired
等注解,将对应的属性或者方法和其对应的注解属性包装成一个对象,缓存起来,以便于在填充属性的时候,直接进行从缓存获取进行属性的填充!
扩展点:实现MergedBeanDefinitionPostProcessor
接口复写postProcessMergedBeanDefinition
方法来控制一些特殊注解的解析!
三、循环依赖中三级缓存的精髓
属性和方法解析完成之后,此时就应该开始注入属性了,在注入属性之前需要保存一个工厂对象,基于这个工厂对象能够返回一个bean对象!为什么要保存工厂对象呢?还记得Spring为了解决循环依赖中的代理问题,就创建了一个三级缓存,里面主要存放为了生成代理对象的工厂对象,这第三次回调就是这个代理对象生成器!
上期Spring三级缓存的问题说的很明白,这里为什么会放一个工厂,这里不做太多的赘述!但是,工厂对象里面是如何生成一个代理对象呢?
他是基于SmartInstantiationAwareBeanPostProcessor#getEarlyBeanReference
的方法来解决代理逻辑的!假设对象发生了循环依赖,就会通过工厂调用这个方法,最终完成AOP的逻辑!
需要注意的是,这里仅仅是设置了一个代理逻辑,并没有真正的调用,这个在整个Spring解决循环依赖中说的很明白!他的调用时机是在被依赖的时候,这里不做赘述!
四、你的自动注入生不生效我说的算
在对象初始化之后,属性注入之前,会进行一次属性是被能够被注入的回调,该胡回调会返回一个布尔类型的返回值来验证最终属性是否生效!
该方法最终会回调InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation
方法,该方法的定义如下:
扩展点:实现InstantiationAwareBeanPostProcessor
接口复写postProcessAfterInstantiation
方法来控制这个类到底需不需要自动注入!
五、属性填充
属性填充是基于后置处理器来做的,这里会会寻找(二)中寻找到的@Value或@Autowirte等属性或者方法,进行对应数据的注入!
Spring自动注入属性的时候会回调,InstantiationAwareBeanPostProcessor#postProcessProperties
回调,完成最后的属性注入!所注入的标识就是在第二步寻找到的字段和方法,通过反射进行操作!
通过实现InstantiationAwareBeanPostProcessor
重写postProcessProperties
方法,可以在某个对象属性注入的时候,就行值得修改操作,可以插手Spring对于值的注入的问题!
和所有的都一样,都是寻找到所有的值,进行循环调用!最后返回属性与值的对应关系以供后续使用!
扩展点:实现InstantiationAwareBeanPostProcessor
接口复写postProcessProperties
方法来控制这个类即将要注入的属性或方法的值!
六、花式Aware接口调用
不知道你是否使用过Spring提供的一些Aware这些额外的扩展接口,不了解的可以去了解一下,灵活使用Aware接口,可以为Spring增加很多意想不到不到的功能,比如一些
SpringUtil
当然大部分是这样命名的,就是通过Aware接口来实现的!
扩展点:实现以上三个接口
复写对应的方法
可以获取对应的属性!
七、Spring Bean初始化前,你想干什么?
你想在Spring回调你的初始化方法之前做些什么吗? Spring当然为你提供了修改的可能性!
Kafka进阶篇知识点
Kafka高级篇知识点
44个Kafka知识点(基础+进阶+高级)解析如下
1628284695318)]
44个Kafka知识点(基础+进阶+高级)解析如下
[外链图片转存中…(img-miYOBdqf-1628284695319)]
由于篇幅有限,小编已将上面介绍的**《Kafka源码解析与实战》、Kafka面试专题解析、复习学习必备44个Kafka知识点(基础+进阶+高级)都整理成册,全部都是PDF文档**,有需求的朋友可以戳这里免费下载