1. 程式人生 > >Spring Boot @Configuration 和 @Component

Spring Boot @Configuration 和 @Component

  @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

,這個後置處理程式專門處理帶有@Configuration註解的類,這個程式會在bean定義載入完成後,在bean初始化前進行處理。其主要處理的過程就是使用 cglib 動態代理對類進行增強,使用增強後的類替換了beanFactory原有的 beanClass,增強類會對其中帶有@Bean註解的方法進行額外處理,確保呼叫帶@Bean註解的方法返回的都是同一個例項。

  但是對於@Component,@Component 註解並沒有通過cglib來代理@Bean方法的呼叫,因此呼叫帶@Bean註解的方法態返回的都是新的例項。