使用@Configuration类定义另一个@Configuration类有什么用?

时间:2015-09-18 15:52:25

标签: java spring

在我和我玩的代码中,我看到一些@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 个答案:

答案 0 :(得分:2)

引导嵌套类时,只需要针对应用程序上下文注册someAutoConfiguration(在您的示例中)。由于是嵌套的@Configuration类,因此将自动注册someConfiguration(在您的示例中)。这避免了在someAutoConfiguration和amp;之间的关系时使用@Import注释的需要。 someConfiguration已经含蓄地清楚了。

如果您选择其他情况,则必须使用@Import(someConfiguration.class)

答案 1 :(得分: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() {
        /* ... */
    }
}

或者,您也可以使用Configuration类(如果已定义any),如下所示:

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