贵阳网站制作方舟网络,软件界面设计ui培训班,499元做网站,网站怎么做备案变更Spring 会利用AutowiredAnnotationBeanPostProcessor.postProcessMergedBeanDefinition() 找出注入点并缓存#xff0c; 找注入点的流程为#xff1a;
遍历当前类的所有的属性字段 Field
查看字段上是否存在 Autowired、Value、Inject 中的其中任意一个#xff0c;存在则认…Spring 会利用AutowiredAnnotationBeanPostProcessor.postProcessMergedBeanDefinition() 找出注入点并缓存 找注入点的流程为
遍历当前类的所有的属性字段 Field
查看字段上是否存在 Autowired、Value、Inject 中的其中任意一个存在则认为该字段是一个注入点。
如果字段是 static 的则不进行注入。
获取 Autowired 中的 required 属性的值如果为 false 则不进行注入。
将字段信息构造成一个 AutowiredFieldElement 对象作为一个注入点对象添加到 currElements 集合中。
用同样的方法遍历所有的方法。将字段信息构造成一个 AutowiredMethodElement 对象作为一个注入点对象添加到 currElements 集合中。
最后将 currElements 集合封装成一个 InjectionMetadata 对象作为当前Bean对于的注入点集合对象并缓存。
大概凡是涉及到依赖注入都绕不开一个问题循环依赖。这应该是依赖注入中最让人头疼的一个问题而 Spring 为此提供了一个教科书级别的解决方案 -- 那就是缓存。
在注入对象的时候如果发现有循环依赖Spring 会先注入一个半成品的对象然后再进行后面的填充属性初始化等操作。具体来说Spring 是使用三级缓存来解决 Bean 之间的循环依赖问题的
1、singletonObjects 一级缓存,缓存 经过了完整生命周期的Bean。
2、earlySingletonObjects 二级缓存, 缓存未经过完整生命周期的 Bean表示缓存的是早期的 Bean 对象。
3、SingletonFactories, 三级缓存缓存的是 lambda 表达式执行之后会生成会得到一个 Bean如果当前 Bean 需要 AOP那么执行 lambda 表达式得到就是对应的代理对象如果无需 AOP则直接得到一个原始对象。