Spring中的@Import和@ContextConfiguration有什么区别?

40

这两个注解的使用有什么区别吗?两个注解都允许使用多个@Configuration类来创建一个ApplicationContext。从它们的文档来看,@ContextConfiguration似乎更适合测试配置,并来自于一个专门用于测试的构件(spring-test),但我还没有找到实际上的区别。

感谢您的任何想法!


1
@ContextConfiguration 只能在测试中使用,在其他代码中它没有任何作用。@Import 在测试中是无用的,只有在 @Configuration 类中才有用,可以导入其他配置类(使用 @ImportResource 可以导入 XML 配置文件)。 - M. Deinum
2
如上所述,使用@Import(也称为包含、加载等)其他Java配置类。例如,那些没有被组件扫描覆盖的类(或者您可能已禁用了对@Configuration文件的组件扫描)。或者创建一个单独的测试配置,该配置导入原始配置,以便您可以覆盖bean... - M. Deinum
@M. Deinum,好的,我明白了第一个想法。但是在第二个想法中,我可以简单地在测试类上放置@Import,为什么要在这里使用@ContextConfiguration?如果我很傻,请原谅我 :) - Dmitry Senkovich
2
因为正如我之前所说,@Import 只对 @Configuration 类有用(并且是有效的)。它在测试类上不起作用,唯一的作用就是占用一行代码。 - M. Deinum
@Deinum - 哇,谢谢 - 我明白了,只是反过来而已。但我不同意,使用 @Import(TestConfig.class) 在我的测试中会导入那些 Bean,如果它们没有在我的 AppConfig 中定义的话。这是被 SpringBootTest 获取到的。这让我很疯狂 - 因为如果我的 AppConfig 已经定义了那个 Bean,那么导入的会被忽略。这毫无意义。所以不要这样做。 - Torsten
显示剩余2条评论
2个回答

25

@Import@ContextConfiguration 用于不同的情况,不能互换使用。

@Import 只能用于导入其他 @Configuration 文件,并且只有在 @Configuration 类上才是有效的(就我所知),而且只能使用在 @Configuration 类上。如果将 @Import 放在测试类上,它将无效。

@Configuration
@Import(PersistenceConfig.class)
public class MainConfig {}

使用@Import可能很有用,例如,如果您已禁用组件扫描以用于@Configuration类,或者您需要来自未被组件扫描覆盖的包的@Configuration类。

注意:还有@ImportResource,它对旧的基于XML的配置文件执行相同的操作。

@ContextConfiguration则适用于仅在基于Spring的测试类(使用SpringRunner运行的jUnit 4测试)上。 它用于为测试提供配置参数以构成测试配置。可以是XML、Javaconfig(或两者的组合)的集合。

@RunWith(SpringRunner.class)
@ContextConfiguration( classes = {MainConfig.class, TestConfig.class})
public MyTest {}

它还允许指定用于加载这些配置的内容(以及其他内容)。


注意:ContextCongifuration可以与XML或Java配置一起使用:
从Spring 3.1开始,上下文加载器可以选择支持基于路径或基于类的资源。
- Dmitry Senkovich
17
好的... 当使用 Spring Boot 时,你实际上可以在测试类上使用 @Import 进行注解。;-) https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/htmlsingle/#boot-features-testing-spring-boot-applications-excluding-config - Sam Brannen
@SamBrannen 但它的行为是否完全相同? - davidcyp
1
这个答案需要更正。@Import 也可以在测试类上使用,以导入 TestConfiguration - Amith Kumar

17

在Spring Boot中,@Import(SomeConfiguration.class)将一个配置类添加到现有的上下文中。它在测试片段中非常有用:

@DataJpaTest
@Import(SomeConfiguration.class)
class TestSomething(){...}

在这里,您可以访问SomeConfiguration类中的存储库和bean。

@ContextConfiguration(classes = SomeConfiguration.class)表示仅使用此配置,可能无法与例如DataJpaTest一起使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接