詳解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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- SpringBoot中@Configuration和@Bean和@Component相同點詳解
- 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的本質區(qū)別
相關文章
Java 使用Socket正確讀取數(shù)據(jù)姿勢
這篇文章主要介紹了Java 使用Socket正確讀取數(shù)據(jù)姿勢,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10
Java中區(qū)別.toString() ,(String),valueOf()方法
這篇文章主要介紹了Java中區(qū)別.toString() ,(String),valueOf()方法,需要的朋友可以參考下2017-01-01
SpringBoot controller接收txt文本文件實現(xiàn)方式
文章介紹在Spring Boot Controller中接收文本文件的方法,需使用MultipartFile類并通過@RequestParam注解獲取,重點說明了獲取文件名、內容及保存文件的常用方法,并強調MultipartFile為接口,需通過注解實例化2025-09-09
java 實現(xiàn)web項目啟動加載properties屬性文件
這篇文章主要介紹了java 實現(xiàn)web項目啟動加載properties屬性文件,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
IntelliJ?IDEA社區(qū)版2021.3配置SpringBoot項目詳細教程及失敗案例
IntelliJ?IDEA?2021.3.3是一款集成開發(fā)環(huán)境,用于Java和其他編程語言的開發(fā),下面這篇文章主要給大家介紹了關于IntelliJ?IDEA社區(qū)版2021.3配置SpringBoot項目詳細教程及失敗案例的相關資料,需要的朋友可以參考下2024-03-03

