Spring注解中@Configuration和@Component到底有啥區(qū)別
Spring 注解中 @Configuration 和 @Component 的區(qū)別總結(jié)為一句話就是:
@Configuration 中所有帶 @Bean 注解的方法都會被動態(tài)代理(cglib),因此調(diào)用該方法返回的都是同一個實例。而 @Conponent 修飾的類不會被代理,每實例化一次就會創(chuàng)建一個新的對象。
在 @Configuration 注解的源代碼中,使用了 @Component 注解:
從定義來看, @Configuration
注解本質(zhì)上還是 @Component
,因此 <context:component-scan/>
或者 @ComponentScan
都能處理 @Configuration
注解的類。
下面我們通過一個例子來說明上述情況:
// 使用@Configuration和@Bean注解創(chuàng)建Room實例和People實例,并注入進spring容器 @Configuration public class RoomPeopleConfig { @Bean public Room room() { Room room = new Room(); room.setId(1); room.setName("房間"); room.setPeople(people());// 在創(chuàng)建Room實例時,再調(diào)用一次People()創(chuàng)建一個People實例 return room; } @Bean public People people() { People people = new People(); people.setId(1); people.setName("小明"); return people; } } // 下面是測試代碼 @SpringBootTest @ContextConfiguration(classes = Application.class) public class ConfigurationTests { @Autowired private Room room; @Autowired private People people; @Test public void test() { System.out.println(people == room.getPeople() ? "是同一個實例" : "不是同一個實例"); } }
輸出結(jié)果:
如果將 @Configuration 換成 @Component ,則輸出:
從上面的結(jié)果可以發(fā)現(xiàn)使用 @Configuration 時在 people 和 spring 容器之中的是同一個對象,而使用 @Component 時是不同的對象。這就是因為 @Configuration 使用了 cglib 動態(tài)代理,返回的是同一個實例對象。
雖然 @Component 注解也會當做配置類,但是并不會為其生成 CGLIB 代理 Class,所以在生成 room 對象時和生成 people 對象時調(diào)用 people( ) 方法執(zhí)行了兩次 new 操作,所以是不同的對象。當使用 @Configuration 注解時,生成當前對象的子類 Class,并對方法攔截,第二次調(diào)用 people()方法時直接從 BeanFactory 之中獲取對象,所以得到的是同一個對象。
其具體底層的實現(xiàn)原理可以去看一看這篇文章:configuration和component區(qū)別底層實現(xiàn)
總結(jié)
到此這篇關于Spring注解中@Configuration和@Component到底有啥區(qū)別的文章就介紹到這了,更多相關@Configuration和@Component的區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- SpringBoot中@Configuration和@Bean和@Component相同點詳解
- Spring解讀@Component和@Configuration的區(qū)別以及源碼分析
- Spring中@Configuration和@Component注解的區(qū)別及原理
- Spring中@Configuration注解和@Component注解的區(qū)別詳解
- 詳解Spring中@Component和@Configuration的區(qū)別
- Spring注解@Configuration和@Component區(qū)別詳解
- Spring @Configuration和@Component的區(qū)別
- 揭秘Spring核心注解@Configuration與@Component的本質(zhì)區(qū)別
相關文章
Spring?Data?Elasticsearch?5.x實現(xiàn)單詞糾錯和自動補全
這篇文章主要為大家介紹了Spring?Data?Elasticsearch?5.x實現(xiàn)單詞糾錯和自動補全示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08java實現(xiàn)1M圖片壓縮優(yōu)化到100kb實現(xiàn)示例
這篇文章主要為大家介紹了java實現(xiàn)1M圖片壓縮優(yōu)化到100kb示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07java中自定義Spring Security權限控制管理示例(實戰(zhàn)篇)
本篇文章主要介紹了java中自定義Spring Security權限控制管理示例(實戰(zhàn)篇) ,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-02-02SpringBoot中多環(huán)境配置和@Profile注解示例詳解
這篇文章主要介紹了SpringBoot中多環(huán)境配置和@Profile注解,本文結(jié)合示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-01-01