spring中@ImportResource注解的使用
@ImportResource注解说明
指示包含要导入的Bean定义的一个或多个资源。
与@Import类似,该注释提供了类似于Spring XML中的<import/>元素的功能。它通常用于设计要由AnnotationConfigApplicationContext引导的@Configuration类,但在某些XML功能(如命名空间)仍然需要的情况下使用。
默认情况下,如果以“.groovy”结尾,将使用GroovyBeanDefinitionReader处理Value属性的参数;否则,将使用XmlBeanDefinitionReader来解析Spring<Beans/>XML文件。或者,可以声明读取器属性,允许用户选择定制的BeanDefinitionReader实现。
关键字 XmlBeanDefinitionReader , 说明这个主机导入的配置文件 , 相当于 spring 的核心配置文件
类似于: spring创建xml类型的上下文代码
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml")
作用:
springboot是基于javaConfig思想和注解 , 所以需要兼容spring的配置文件 , 我们可以使用该注解
源码解析
spring注解解析的核心解析类
ConfigurationClassPostProcessor
解析功能交给 ConfigurationClassParser
关键代码
ConfigurationClassParser.class
获取spring配置文件和BeanDefinnition解析器
// Process any @ImportResource annotations
AnnotationAttributes importResource =
AnnotationConfigUtils.attributesFor(sourceClass.getMetadata(), ImportResource.class);
if (importResource != null) {
String[] resources = importResource.getStringArray("locations");
Class<? extends BeanDefinitionReader> readerClass = importResource.getClass("reader");
for (String resource : resources) {
String resolvedResource = this.environment.resolveRequiredPlaceholders(resource);
configClass.addImportedResource(resolvedResource, readerClass);
}
}
ConfigurationClassPostProcessor.class
public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) {
this.reader.loadBeanDefinitions(configClasses);
}
根据方法调用找到源码解析的最终方法
根据注释我们知道 , @ImportResources 是解析 xml 格式文件
所以 BeanDefiniton 一定是 BeanDefinitonReader 一定是 xml 类型的
所以找到 XmlBeanDefinitonReader

## 实现案例
### 环境
springboot脚手架环境
`pom.xml`
```xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>springboot-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
<!-- springboot 整合 web 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
准备spring上下文容器
配置类
JavaXmlAndConfgBean.java
@ImportResource("classpath:myimportconfig.xml")
@Configuration
@ComponentScan("com.example.importresourcestest")
public class JavaXmlAndConfgBean {
}
测试javabean
public class MyImortXmlBean {
public void sayHello(){
System.out.println("MyImortXmlBean.sayHello----> 测试使用注解的方式导入spring的xml配置文件");
}
}
需要加载的spring配置文件
<?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="myImortXmlBean" class="com.example.importresourcestest.MyImortXmlBean"></bean>
</beans>
测试类
package com.example.importresourcestest;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class ImportResourceTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(JavaXmlAndConfgBean.class);
MyImortXmlBean bean = ac.getBean(MyImortXmlBean.class);
System.out.println(bean);
bean.sayHello();
}
}
控制台打印
com.example.importresourcestest.MyImortXmlBean@cd3fee8
MyImortXmlBean.sayHello----> 测试使用注解的方式导入spring的xml配置文件