2015-09-18 43 views
1

在我與我打的代碼已經看到了一些地方是一個@Configuration類什麼都不做,但是可以定義一個靜態類。格式各不相同,但一般是這樣的:什麼是使用具有@Configuration類中定義的另一個@Configuration類的?

@Configuration 
public class someAutoConfiguration { 

    @EnableConfigurationProperty(...) 
    @utoConfigureAfter(...) 
    @Configureation 
    public static class someConfiguration 
    { 
     @Autowired 
     //whatever needs autowired 

     @Bean 
     public myBean createBean(){ 

      //construct bean 
     } 
    } 

很清楚如何將這些豆類運行和類做什麼,但我的兩件事情,爲什麼它需要的疑惑,而它甚至以下合同@configuration。

我可以找到@Configuration的所有定義,說它用於用@Bean定義bean,我還沒有找到任何其他的註釋承諾。因此,似乎沒有承諾靜態類甚至會被構建或被認爲是@Configuration文件在它自己的權利?這顯然是,我並不感到驚訝它會是這樣,但確實在@Configuration合同保證這種行爲?

秒,有什麼優勢?大概有一些原因需要兩個類,而不是刪除靜態類並將其所有註釋放在父類中?

回答

2

在引導嵌套類時,只需要在應用程序上下文中註冊someAutoConfiguration(在你的例子中)。由於是嵌套的@Configuration類,someConfiguration(在你的例子中)將被自動註冊。這避免了需要使用@Import註釋時someAutoConfiguration & someConfiguration之間的關係已經隱含清楚。

如果您選擇其他方式,則必須使用@Import(someConfiguration.class)

+0

也可以達到同樣的事情'@ ComponentScan'? –

+1

在一個古老的問題回頭看,無論答案是能夠解決爲什麼這個代碼的存在,這可能只是因爲代碼實際上是毫無意義的是我的第一本能建議。你至少回答我的問題,所以這個採摘一半,人的功勞;) – dsollen

1

你對兩件完全不同的事情感到困惑。使用@Configuration註解幷包含Beans Definition的類提供了Spring Context的基於XML的方法的替代方案。在這個類中不需要任何嵌套類。

如果您正在爲您的應用程序編寫集成測試,那麼您可以使用嵌套類來指定配置。例如,

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(loader=AnnotationConfigContextLoader.class) 
public class FooTest { 

    @Configuration 
    static class ContextConfiguration { 

     @Bean 
     public Foo foobar() { 
      return new Foo(); 
     } 
    } 

    @Autowired 
    private Foo foobar; 

    @Test 
    public void testFoo() { 
     /* ... */ 
    } 
} 

或者,你也可以用你的配置類(如果已經定義的話)如下:

@ContextConfiguration(classes=YourConfiguration.class, loader=AnnotationConfigContextLoader.class) 
+0

我不是一個做這個,我inherrited代碼。我只是想弄明白爲什麼。 – dsollen

+0

你試圖實現什麼? – user2004685

+0

這就是我希望有人可以告訴我:)在這一點上,我最好的印象是,有一些地方使用了靜態配置類,因此可以在配置過程中靜態調用靜態配置類,並且因爲每個人都複製粘貼,即使是那些那不需要靜態類就結束了。除了開發者已經相當不錯,否則我很驚訝他們會那麼sl,,想知道我是否錯過了一些東西。 – dsollen

相關問題