Spring @Import 和 @ImportResource 注解

Spring @Import 和 @ImportResource 注解

在本文中,您将学习使用 Spring 的 @Import 和 @ImportResource 注解分别从 java-config 类和 XML 配置中导入配置。这些注解与@Configuration 注解配合得很好。

概述

如您所知,@Configuration 类代表 @Bean 和其他 Spring IoC 配置。您还可以在 Spring 应用程序中使用基于 XML 的 bean 配置。Spring 允许您使用多个 @Configuration 类并使用 @Import 注解组合(导入)它们。同样,如果要混合使用 XML 和 Java 配置,则需要使用 @ImportResource 注解。

1、@Import 注解用于导入使用@Configuration 注解的多个类。

2、@ImportResource 注解指示要导入的一个或多个基于 XML 的 bean 定义文件。

通过@ImportResource 加载的配置优先于@Bean。使用外部 bean 配置文件来覆盖代码级配置是有意义的。

 

@Import 和 @ImportResource 注释示例

让我们考虑一个同时处理离线订单(取货)和在线订单(送货订单)的示例商店。我们有两个订单处理器类,OfflineOrderProcessor 和 OnlineOrderProcessor。离线订单处理器 bean 使用 java 配置类 OfflineStoreConfig 注册,但在线订单处理器 bean 使用 XML config online-store-config.xml 注册。

要尝试此示例,请创建一个 maven 项目并添加最新版本的 Spring 核心和 Spring 上下文依赖项。

<dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
    </dependency>
  </dependencies>

1、Offline store processor and config class

OfflineOrderProcessor

package com.jbd.sc.items.offline;
public class OfflineOrderProcessor {
  public void processOrder(String item) {
    System.out.println("Offline order processed: " + item);
  }
}
package com.jbd.sc.items.offline;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class OfflineStoreConfig {
  @Bean
  public OfflineOrderProcessor offlineOrderProcessor() {
    return new OfflineOrderProcessor();
  }
}

2、Next, create the Online order processor and XML config

OnlineOrderProcessor

package com.jbd.sc.items.online;
public class OnlineOrderProcessor {
  public void processOrder(String item) {
    System.out.println("Online order processed: " + item);
  }
}

resources/online-store-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
  <bean id="onlineOrderProcessor" scope="singleton"
        class="com.jbd.sc.items.online.OnlineOrderProcessor"/>
</beans>

3、Use @Import and @ImportResource

现在我们将在最终配置类上使用@Import 来导入OfflineStoreConfig 和@ImportResource 以包含xml 配置资源/online-store-config.xml。

package com.jbd.sc.importannotation;
import com.jbd.sc.items.offline.OfflineOrderProcessor;
import com.jbd.sc.items.offline.OfflineStoreConfig;
import com.jbd.sc.items.online.OnlineOrderProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;
@Configuration
@Import(OfflineStoreConfig.class)
@ImportResource("classpath:online-store-config.xml")
public class ApplicationConfig {
  public static void main(String[] args) {
    ApplicationContext context
      = new AnnotationConfigApplicationContext(ApplicationConfig.class);
    context.getBean(OfflineOrderProcessor.class).processOrder("Book");
    context.getBean(OnlineOrderProcessor.class).processOrder("Mobile Phone");
  }
}

输出

Offline order processed: Book
Online order processed: Mobile Phone

 

聚合配置

您可以在 @Import 和 @ImportResource 注释中对多个配置进行分组。在前面的示例中,我们在这些注释中仅使用了单个类和单个 xml 配置文件。但是您可以传递多个类和 xml bean 定义文件作为参数。

@Configuration
@Import({ SavingAccountConfig.class, LoanAccountConfig.class })
class AccountConfiguration {
}
@Configuration
@ImportResource({ "saving-account-config.xml", "loan-account-config.xml" })
class AccountConfiguration {
}

 

总结:

这是一个小话题,希望您对 Spring 的 @Import 和 @ImportResource 注解以及如何在单个配置文件中聚合多个 bean 配置有一个清晰的概念。您也可以在 Junit 测试类上使用相同的注释。我建议您尽可能使用 @ComponentScan 注释而不是这些注释。

版权声明:著作权归作者所有。

相关推荐

Kotlin: package和import

packageKotlin的代码结构是通过源文件和package组织。在源文件的开头声明package,如package foo.bar fun baz() {} class Goo {} // ... 在声明的package源文件里的所有内容均属于此package。如示例里的baz函数和类Goo全名分别为foo.bar.baz和f

Kotlin使用kotlin-kapt插件支持Android的注解处理

在Kotlin可以使用kapt插件来支持Android的注解处理。在Gradle配置kotlin-kapt插件如下:在app的build.gradle添加插件apply plugin: 'kotlin-kapt' 使用kapt添加注解依赖java使用annotationProcessor 添加的依赖改为使用kapt。例如添加dagger依赖dependencies {

理解React Native的Props和State

Props和State是React Native分别用来控制组件中两种不同类型的数据。Propsprops是Properties的简写,称为属性。props的特点是在组件内它是不可变,或者说不能被修改。在React数据流是单向的,从父组件到子组件的方向传递。props就是组件从父组件接收的数据,在组件内部是不能对它修改。props不可变的特性是有助于我们写可复用的组件。我们只需要对一个组

Spirng Security使用注解对方法做权限安全控制

 Spring Security默认情况下是关闭了对方法级的安全控制。可以通过xml或者是在添加了@Configuration注解的bean上添加@EnableGlobalMethodSecurity来开启对方法级别的安全控制。Spring Security 支持三种方法级注解, 分别是 JSR-205/Secured 注解/prePostEnabled,可以在开启对方法级的安全控制时设

Spring Cloud集成ZooKeeper注册中心绑定指定ip,解决UnknownHostException

Spring Cloud集成Zookeeper作为注册中心,从网关Spring Cloud GateWay转发给微服务里,在微服务里看到发送请求过来是以主机别名为url,如主机别名是server1.cluster,那么访问的地址是http://server.cluster/xxx。在GateWay有时会导致找不到服务。报类似如下的错误:500 Server Error for HTTP GET "