使用@Autowired注解自動裝配的過程是怎樣的?
記住:@Autowired 通過Bean的后置處理器進行解析的
\1. 在創建一個Spring上下文的時候再構造函數中進行注冊AutowiredAnnotationBeanPostProcessor
\2. 在Bean的創建過程中進行解析
\1. 在實例化后預解析(解析@Autowired標注的屬性、方法 比如:把屬性的類型、名稱、屬性所在的類..... 元數據緩存起)
\2. 在屬性注入真正的解析(拿到上一步緩存的元數據 去ioc容器幫進行查找,並且返回注入)
a. 首先根據預解析的元數據拿到 類型去容器中進行查找
如果查詢結果剛好為一個,就將該bean裝配給@Autowired指定的數據;
如果查詢的結果不止一個,那么@Autowired會根據名稱來查找;
如果上述查找的結果為空,那么會拋出異常。解決方法時,使用required=false。

@Configuration的作用解析原理
1.@Configuration用來代替xml配置方式spring.xml配置文件
-
沒有@Configuration也是可以配置@Bean
-
@Configuration加與不加有什么區別
-
加了@Configuration會為配置類創建cglib動態代理(保證配置類@Bean方法調用Bean的單例),@Bean方法的調用就會通過容
器.getBean進行獲取
原理:
1.創建Spring上下文的時候會注冊一個解析配置的處理器ConfigurationClassPostProcessor(實現BeanFactoryPostProcessor和
BeanDefinitionRegistryPostProcessor)
2.在調用invokeBeanFactoryPostProcessor,就會去調用
ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry進行解析配置(解析配置類說白就是去解析各種注解
(@Bean @Configuration@Import @Component ... 就是注冊BeanDefinition)
- ConfigurationClassPostProcessor.postProcessBeanFactory去創建cglib動態代理
