在Spring框架中使用@Import和@ImportResource注释有什么区别?

时间:2015-02-07 12:11:52

标签: java spring spring-mvc annotations

我正在攻读Spring Core认证,我怀疑与 @import @importresource 注释有关。

例如,我有一个名为 RootConfig.java 的配置类,这个:

@Configuration
@Import({AppConfig.class,DbConfig.class})
@ImportResource("classpath:/config/security-config.xml")
@EnableTransactionManagement
public class RootConfig {

}

所以我知道在这个例子中:

@Import({AppConfig.class,DbConfig.class})

正在导入另外两个配置类(比如将这些配置包含在我的 RootConfig.java 配置类所代表的主配置中。

Ant我明白了:

@ImportResource("classpath:/config/security-config.xml")

正在导入XML文件。

所以我的疑问是:为什么存在2个不同的注释,它们执行非常相似的任务?为什么不使用单个注释来导入配置类和资源(例如xml文件或属性文件?)

这只是一种语义差异还是还有别的东西?

2 个答案:

答案 0 :(得分:5)

  • @Import

    表示要导入的一个或多个@Configuration个类。用于导入基于Java代码的配置。 e.g。

    @Configuration
    @Import({ DataSourceConfig.class, TransactionConfig.class })
    public class AppConfig { ... }
    

    Using the @Import annotation

  • 中查看更多内容
  • @ImportResource

    表示包含要导入的bean定义的一个或多个资源。用于导入基于XML的配置或其他非@Configuration bean定义资源。 e.g。

    @Configuration
    @ImportResource({"classpath:spring-security.xml"})
    public class SecurityConfig { ... }
    

    @Configuration class-centric use of XML with @ImportResource

  • 中查看更多内容

答案 1 :(得分:2)

@ImportResource 旨在用于以Java为中心的配置上下文。文档说,

  

在@Configuration类是主要机制的应用程序中   为了配置容器,它仍然可能是必要的   至少使用一些XML。在这些场景中,只需使用@ImportResource即可   并根据需要定义尽可能多的XML。这样做可以实现   “以Java为中心”的方法来配置容器并保持XML   最低限度。

一个重要方面是,在使用 @ImportResource XML配置时,您可以使用 @Bean 注释覆盖以Java为中心的配置。这意味着您可以覆盖配置(通过更改配置XML)而不会影响代码。这个语义为您提供了一个上下文,您可以考虑使用 @ImportResource ,并且在我看来它是一个非常有价值的资产,因为对于以Java为中心的配置最常见的批评之一是它需要代码重新编译

第二个上下文提供了逐步从以XML为中心的配置转向以Java为中心的配置的方法。