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

5

我正在学习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})

您需要导入其他2个配置类(类似于将这些配置包含到由RootConfig.java配置类表示的主配置中)。

我理解:

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

正在导入XML文件。

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

这只是语义上的区别还是还有其他原因?

2个回答

9
  • @Import

    Indicates one or more @Configuration classes to import. For import Java code-based configuration. e.g.

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

    See more in Using the @Import annotation.

  • @ImportResource

    Indicates one or more resources containing bean definitions to import. For import XML-based configuration or other non-@Configuration bean definition resources. e.g.

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

    See more in @Configuration class-centric use of XML with @ImportResource.


4

@ImportResource旨在用于Java配置上下文中。文档说:

在使用@Configuration类作为主要机制进行容器配置的应用程序中,仍然可能需要使用至少一些XML。在这些情况下,只需使用@ImportResource并定义所需的XML即可。这样做可以实现“以Java为中心”的方法来配置容器,并将XML最小化。

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

第二个上下文是提供逐步从XML-centric到Java-centric配置的手段。


谢谢,解释得非常好。现在我明白了 :-) - user4296472

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