2014-10-03 68 views
0

我知道彈簧AnnotationConfigApplicationContext不僅能夠接受@Configuration類作爲輸入,而且還能夠接受使用JSR-330元數據註釋的類和類的普通@Component類。Java @Component類和具有AnnotationConfigApplicationContext的@Configuration類

我在下面創建了AppConfig.java而沒有@Configuration註釋。

public class AppConfig { 

    @Bean(name="sampleService") 
    public SampleService getSampleService(){ 
     return new SampleService(); 
    } 

} 

通過了這個課程作爲我的java配置類AnnotationConfigApplicationContext,它接受和註冊我的服務豆。

我在如下的相同AppConfig上做了一些修改。

@Component 
    public class AppConfig { 

    @Bean(name="sampleService") 
    public SampleService getSampleService(){ 
      return new SampleService(); 
    } 
    } 

將AppConfig傳遞給AnnotationConfigApplicationContext,它接受並註冊我的服務bean。

問:

  1. AnnotationConfigApplicationContext類是接受與@Configuration java的配置類,沒有@Configuration與@Component註解,就是@Component@Configuration之間的區別?

  2. 爲什麼即使沒有@Configuration註解也接受?

  3. 何時使用@Configuration以及何時使用@Component作爲java配置類?

回答

2

@Component

指示的帶註釋類是一個 「組件」。

也就是說,在啓用組件掃描的上下文中,Spring爲@Component帶註釋的類型生成bean定義。這些bean定義最終變成了bean。

@Configuration,其本身與

註釋表示一個類聲明一個或多個@Bean方法,並且可以是 由Spring容器處理以生成bean定義並在運行時對那些豆 服務請求, [...]

因此,任何@Configuration類型,爲其生成一個bean,作爲bean的工廠。

javadoc of @Bean狀態

@Bean方法也可以不在 標註有@Configuration類中聲明。例如,Bean方法可能是類中聲明的 ,或者甚至在普通的舊類中聲明。在這樣的 的情況下,@Bean方法將以所謂的「精簡」模式進行處理。

豆在精簡版模式方法將由 被視爲純工廠方法容器(類似於XML工廠方法聲明)中,用 作用域和生命週期回調正確應用。在這種情況下,包含類 保持不變,對於包含類或工廠方法,沒有異常約束 。

與類別@Configuration 中bean方法的語義相反,在「模式」模式下不支持「bean間引用」。 相反,當一個@Bean-方法調用另一個@Bean-方法,方式爲精簡 模式時,該調用是標準的Java方法調用; Spring 不通過CGLIB代理攔截調用。這類似於 inter-@Transactional方法調用,其中在代理模式下,Spring不會調用 來攔截調用 - Spring只在AspectJ模式下這樣做。

所以@Bean方法有@Configuration註解的類的全部功能和有限的功能在@Component註釋類。

爲什麼它即使沒有@Configuration註釋也接受?

這就是班級的設計。 ApplicationContextBeanFactoryAnnotationConfigApplicationContext只是提供了一種額外的方式來註冊一個bean定義。

何時使用@Configuration以及何時使用@Component作爲java config class?

這些確實完全不同的目標。按照javadoc。當您需要設置ApplicationContext時,可以使用帶有@Configuration帶註釋的類的AnnotationConfigApplicationContext。如果你只需要一個bean,用@Component註釋它的類型。

+0

謝謝德利曼拿利斯,現在我很清楚。 – Lovababu 2014-10-04 13:17:53