在我和我玩的代码中,我看到一些@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合同保证这种行为吗?
第二,有什么好处?可能有一些原因我们需要两个类,而不是删除静态类并将其所有注释放在父类上?答案 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)