詳解Spring中@Component和@Configuration的區(qū)別
總結
直接上總結:加了@Configuration的類會被CGLIB進行動態(tài)代理,不加或者加@Component注解則不會被代理
。
正文
首先我們都知道使用Spring的@ComponentScan注解可以掃描到@Configuration和@Component的類,并將其交由Spring容器管理,默認會放入單例池中。
新建了一個BeanConfig類用來測試結果:
@Configuration public class BeanConfig { }
通過上下文獲取IOC容器中的BeanConfig,發(fā)現(xiàn)確實是被CGLIB進行了代理。
執(zhí)行查看上下文中beanFactory的單例池中確實存在。
將BeanConfig類的@Configuration注解改為@Component后再看一下則顯示沒有被CGLIB代理。
問題
那么Spring為什么設計@Configuration注解修飾的Bean要被動態(tài)代理?
先說結果:Spring的目的是讓@Configuration注解的類中被@Bean注解的方法生成的對象是單例,那如何使一個方法每次生成返回的對象都是同一個,代理就是其中一種方式。
首先@Configuration注解的作用是用于定義配置類來替換XML配置文件,被注解的類內部包含有一個或多個被@Bean注解的方法,這些方法會被用于構建BeanDefinition,初始化Spring容器。
也就是說@Configuration的主要目的是搭配@Bean注解替代XML配置文件來向Spring容器注入Bean。
我們在BeanConfig類中增加兩個@Bean注解的方法:
@Configuration public class BeanConfig { //@Scope("prototype") @Bean public Role role(){ return new Role(); } @Bean public User user(){ Role r1=role(); Role r2=role(); System.out.println(r1==r2); return new User(); } }
通過Spring的處理,直接調用 @Configuration 注解中bean 方法,獲取的就是同一個對象,這樣想要直接使用某個@Bean注解的對象就不需要 @Autowired 注入了。
當然你非要在方法上加上注解@Scope("prototype"),每次調用該方法還是會生成不同的對象。
源碼
注解配置讀取器:向BeanDefinitionMap中添加了7個元素,其中一個就是ConfigurationClassPostProcessor
org.springframework.context.annotation.AnnotationConfigApplicationContext#AnnotationConfigApplicationContext()
執(zhí)行所有的BeanFactoryPostProcessor的postProcessorBeanFactory()方法
org.springframework.context.support.AbstractApplicationContext#refresh() 方法中的invokeBeanFactoryPostProcessors(beanFactory) org.springframework.context.annotation.ConfigurationClassPostProcessor#postProcessBeanFactory
查找到所有帶有 @Configuration 注解的 bean 定義,然后在第二個 for 循環(huán)中對類進行增強
org.springframework.context.annotation.ConfigurationClassPostProcessor#enhanceConfigurationClasses
到此這篇關于詳解Spring中@Component和@Configuration的區(qū)別的文章就介紹到這了,更多相關Spring @Component和@Configuration區(qū)別內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring MVC利用Swagger2如何構建動態(tài)RESTful API詳解
這篇文章主要給大家介紹了關于在Spring MVC中利用Swagger2如何構建動態(tài)RESTful API的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧。2017-10-10SpringBoot配置Spring?Security的實現(xiàn)示例
本文主要介紹了SpringBoot配置Spring?Security的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-10-10Spring實戰(zhàn)之FileSystemResource加載資源文件示例
這篇文章主要介紹了Spring實戰(zhàn)之FileSystemResource加載資源文件,結合實例形式分析了spring FileSystemResource加載xml資源文件的具體實現(xiàn)步驟與相關操作技巧,需要的朋友可以參考下2019-12-12MyBatisPlus-QueryWrapper多條件查詢及修改方式
這篇文章主要介紹了MyBatisPlus-QueryWrapper多條件查詢及修改方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06