@Autowired與@Configuration


使用@Autowired注解自動裝配的過程是怎樣的?

記住:@Autowired 通過Bean的后置處理器進行解析的

\1. 在創建一個Spring上下文的時候再構造函數中進行注冊AutowiredAnnotationBeanPostProcessor

\2. 在Bean的創建過程中進行解析

\1. 在實例化后預解析(解析@Autowired標注的屬性、方法 比如:把屬性的類型、名稱、屬性所在的類..... 元數據緩存起)

\2. 在屬性注入真正的解析(拿到上一步緩存的元數據 去ioc容器幫進行查找,並且返回注入)

a. 首先根據預解析的元數據拿到 類型去容器中進行查找

如果查詢結果剛好為一個,就將該bean裝配給@Autowired指定的數據;

如果查詢的結果不止一個,那么@Autowired會根據名稱來查找;

如果上述查找的結果為空,那么會拋出異常。解決方法時,使用required=false。
![image-20211010194410175](/Users/chentao/Library/Application Support/typora-user-images/image-20211010194410175.png)

@Configuration的作用解析原理

1.@Configuration用來代替xml配置方式spring.xml配置文件

  1. 沒有@Configuration也是可以配置@Bean

  2. @Configuration加與不加有什么區別

  3. 加了@Configuration會為配置類創建cglib動態代理(保證配置類@Bean方法調用Bean的單例),@Bean方法的調用就會通過容

器.getBean進行獲取

原理:

1.創建Spring上下文的時候會注冊一個解析配置的處理器ConfigurationClassPostProcessor(實現BeanFactoryPostProcessor和

BeanDefinitionRegistryPostProcessor)

2.在調用invokeBeanFactoryPostProcessor,就會去調用

ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry進行解析配置(解析配置類說白就是去解析各種注解

(@Bean @Configuration@Import @Component ... 就是注冊BeanDefinition)

  1. ConfigurationClassPostProcessor.postProcessBeanFactory去創建cglib動態代理


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM