詳解Spring中@Component和@Configuration的區(qū)別
總結(jié)
直接上總結(jié):加了@Configuration的類會(huì)被CGLIB進(jìn)行動(dòng)態(tài)代理,不加或者加@Component注解則不會(huì)被代理
。
正文
首先我們都知道使用Spring的@ComponentScan注解可以掃描到@Configuration和@Component的類,并將其交由Spring容器管理,默認(rèn)會(huì)放入單例池中。
新建了一個(gè)BeanConfig類用來(lái)測(cè)試結(jié)果:
@Configuration public class BeanConfig { }
通過(guò)上下文獲取IOC容器中的BeanConfig,發(fā)現(xiàn)確實(shí)是被CGLIB進(jìn)行了代理。
執(zhí)行查看上下文中beanFactory的單例池中確實(shí)存在。
將BeanConfig類的@Configuration注解改為@Component后再看一下則顯示沒(méi)有被CGLIB代理。
問(wèn)題
那么Spring為什么設(shè)計(jì)@Configuration注解修飾的Bean要被動(dòng)態(tài)代理?
先說(shuō)結(jié)果:Spring的目的是讓@Configuration注解的類中被@Bean注解的方法生成的對(duì)象是單例,那如何使一個(gè)方法每次生成返回的對(duì)象都是同一個(gè),代理就是其中一種方式。
首先@Configuration注解的作用是用于定義配置類來(lái)替換XML配置文件,被注解的類內(nèi)部包含有一個(gè)或多個(gè)被@Bean注解的方法,這些方法會(huì)被用于構(gòu)建BeanDefinition,初始化Spring容器。
也就是說(shuō)@Configuration的主要目的是搭配@Bean注解替代XML配置文件來(lái)向Spring容器注入Bean。
我們?cè)贐eanConfig類中增加兩個(gè)@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(); } }
通過(guò)Spring的處理,直接調(diào)用 @Configuration 注解中bean 方法,獲取的就是同一個(gè)對(duì)象,這樣想要直接使用某個(gè)@Bean注解的對(duì)象就不需要 @Autowired 注入了。
當(dāng)然你非要在方法上加上注解@Scope("prototype"),每次調(diào)用該方法還是會(huì)生成不同的對(duì)象。
源碼
注解配置讀取器:向BeanDefinitionMap中添加了7個(gè)元素,其中一個(gè)就是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 定義,然后在第二個(gè) for 循環(huán)中對(duì)類進(jìn)行增強(qiáng)
org.springframework.context.annotation.ConfigurationClassPostProcessor#enhanceConfigurationClasses
到此這篇關(guān)于詳解Spring中@Component和@Configuration的區(qū)別的文章就介紹到這了,更多相關(guān)Spring @Component和@Configuration區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot中@Configuration和@Bean和@Component相同點(diǎn)詳解
- Spring解讀@Component和@Configuration的區(qū)別以及源碼分析
- Spring中@Configuration和@Component注解的區(qū)別及原理
- Spring中@Configuration注解和@Component注解的區(qū)別詳解
- Spring注解@Configuration和@Component區(qū)別詳解
- Spring注解中@Configuration和@Component到底有啥區(qū)別
- Spring @Configuration和@Component的區(qū)別
- 揭秘Spring核心注解@Configuration與@Component的本質(zhì)區(qū)別
相關(guān)文章
親身體驗(yàn)Intellij?Idea從卡頓到順暢全過(guò)程
這篇文章主要介紹了親身體驗(yàn)Intellij?Idea從卡頓到順暢全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09SpringBoot 項(xiàng)目添加 MDC 日志鏈路追蹤的執(zhí)行流程
日志鏈路追蹤就是將一個(gè)標(biāo)志跨線程進(jìn)行傳遞,在一般的小項(xiàng)目中也就是在你新起一個(gè)線程的時(shí)候,或者使用線程池執(zhí)行任務(wù)的時(shí)候會(huì)用到,比如追蹤一個(gè)用戶請(qǐng)求的完整執(zhí)行流程,本文給大家介紹SpringBoot MDC 日志鏈路追蹤的代碼,感興趣的朋友一起看看吧2021-06-06idea創(chuàng)建spring boot工程及配置文件(最新推薦)
本文給大家介紹idea創(chuàng)建spring boot工程及配置文件,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-11-11JAVA復(fù)制數(shù)組和重置數(shù)組大小操作
這篇文章主要介紹了JAVA復(fù)制數(shù)組和重置數(shù)組大小操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09SpringCloud之loadbalancer負(fù)載均衡組件實(shí)戰(zhàn)詳解
LoadBalancer是Spring Cloud官方提供的負(fù)載均衡組件,可用于替代Ribbon,這篇文章主要介紹了SpringCloud之loadbalancer負(fù)載均衡組件,需要的朋友可以參考下2023-06-06@TableName注解和@Table的區(qū)別及說(shuō)明
這篇文章主要介紹了@TableName注解和@Table的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01Java基于ServletContextListener實(shí)現(xiàn)UDP監(jiān)聽(tīng)
這篇文章主要介紹了Java基于ServletContextListener實(shí)現(xiàn)UDP監(jiān)聽(tīng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12