Spring Boot @Configuration 和 @Component
阿新 • • 發佈:2019-02-07
@Configuration中所有帶@Bean註解的方法都會被動態代理,呼叫該方法返回的都是同一個例項。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
String value() default "";
}
從定義來看,@Configuration註解本質上還是@Component,因此<context:component-scan/>
或者@ComponentScan
都能處理@Configuration註解的類。
@Configuration 標記的類必須符合下面的要求:
- 配置類必須以類的形式提供(不能是工廠方法返回的例項),允許通過生成子類在執行時增強(cglib 動態代理)。
- 配置類不能是 final 類(沒法動態代理)。
- 配置註解通常為了通過 @Bean 註解生成 Spring 容器管理的類。
- 配置類必須是非本地的(即不能在方法中宣告,不能是 private)。
- 任何巢狀配置類都必須宣告為static。
- @Bean方法不能建立進一步的配置類(也就是返回的bean如果帶有@Configuration,也不會被特殊處理,只會作為普通的 bean)。
Spring 容器在啟動時,會載入預設的一些PostPRocessor,其中就有 ConfigurationClassPostProcessor
但是對於@Component,@Component 註解並沒有通過cglib來代理@Bean方法的呼叫,因此呼叫帶@Bean註解的方法態返回的都是新的例項。