@Import 介绍
@Import
是 Spring 框架中的一个注解,用于导入配置类或组件。它可以将一个或多个配置类或组件导入到当前的配置类或组件中,从而实现配置的复用和组合。
在Spring Boot应用中,@Import
注解可以帮助我们更加灵活地组织和管理配置类。
使用 @Import
注解时,需要指定要导入的配置类或组件的类名或数组。例如:
@Configuration
@Import( {ConfigA.class, ConfigB.class} )
public class AppConfig {
// ...
}
@Import源码:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
Class<?>[] value();
}
源代码截图
@Import 属性介绍
- value:Class数组类型,用于指定其他配置类的字节码,支持指定多个配置类。另外,使用value属性指定的有一定的条件,必须是普通类、实现了ImportSelector接口的类和实现了ImportBeanDefinitionRegistrar接口的类。
@Import 使用场景
-
导入配置类:在 Spring 中,可以通过
@Configuration
注解定义配置类,然后在其他配置类中使用@Import
注解导入该配置类,从而实现配置的复用和组合。例如,在AppConfig
配置类中导入ConfigA
和ConfigB
两个配置类,可以将ConfigA
和ConfigB
中的配置应用到AppConfig
中。 -
导入组件:在 Spring 中,可以通过
@Component
注解定义组件,然后在其他配置类中使用@Import
注解导入该组件,从而将该组件注册到 Spring 容器中。例如,在AppConfig
配置类中导入ComponentA
和ComponentB
两个组件,可以将ComponentA
和ComponentB
注册为 Spring 容器中的 Bean。 -
导入其他注解配置:在 Spring 中,除了
@Configuration
和@Component
注解外,还有其他一些注解也可以用于配置,例如@Bean
、@Service
、@Repository
等。在其他配置类中使用@Import
注解导入这些注解配置,可以将这些配置应用到当前的配置类中。 -
如果在项目中需要引入第三方的类,并且需要将这些类的对象注入到IOC容器中,也可以使用@Import注解。
需要注意的是,@Import
注解只能用于 @Configuration
注解的配置类中,不能用于普通的 Java 类或接口中。同时,@Import
注解只能导入类,不能导入接口或枚举等其他类型的类。
@Import 测试示例代码
示例代码 一: 将普通Bean对象注入到IOC容器
ImportDemo 类
package com.yang.SpringTest.annotation.importLearn;
/**
* <p>ImportDemo 类</p>
*
* @author By: chengxuyuanshitang
* Package com.yang.SpringTest.annotation.importLearn
* Ceate Time 2024-03-14 14:00
*/
@Data
public class ImportDemo {
}
配置类
package com.yang.SpringTest.annotation.importLearn;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
/**
* <p>配置类 </p>
*
* @author By: chengxuyuanshitang
* Package com.yang.SpringTest.annotation.importLearn
* Ceate Time 2024-03-14 14:01
*/
@Import(value = {ImportDemo.class})
@Configuration
public class ImportConfig {
}
测试类
package com.yang.SpringTest.annotation.importLearn;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import java.util.Arrays;
/**
* <p>测试类</p>
*
* @author By: chengxuyuanshitang
* Package com.yang.SpringTest.annotation.importLearn
* Ceate Time 2024-03-14 14:02
*/
public class ImportDemoTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ImportConfig.class);
String[] definitionNames = context.getBeanDefinitionNames();
Arrays.stream(definitionNames).forEach((definitionName) -> System.out.println(definitionName));
}
}
运行结果
示例代码 二: 实现ImportSelector接口
将selectImports()方法返回的Bean数组注入到IOC容器,实现ImportSelector接口的类对象本身不会被注册到IOC容器中。
ImportSelectorDemoBean类
package com.yang.SpringTest.annotation.importLearn;
import lombok.Data;
/**
* @author By: chengxuyuanshitang
* Package com.yang.SpringTest.annotation.importLearn
* Ceate Time 2024-03-14 14:09
*/
@Data
public class ImportSelectorDemoBean {
}
ImportDemoSelector类
package com.yang.SpringTest.annotation.importLearn;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
/**
* @author By: chengxuyuanshitang
* Package com.yang.SpringTest.annotation.importLearn
* Ceate Time 2024-03-14 14:11
*/
public class ImportDemoSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{ImportSelectorDemoBean.class.getName()};
}
}
配置类
package com.yang.SpringTest.annotation.importLearn;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
/**
* <p>配置类 </p>
*
* @author By: chengxuyuanshitang
* Package com.yang.SpringTest.annotation.importLearn
* Ceate Time 2024-03-14 14:01
*/
@Import(value = { ImportDemoSelector.class})
@Configuration
public class ImportConfig {
}
测试类
package com.yang.SpringTest.annotation.importLearn;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import java.util.Arrays;
/**
* <p>测试类</p>
*
* @author By: chengxuyuanshitang
* Package com.yang.SpringTest.annotation.importLearn
* Ceate Time 2024-03-14 14:02
*/
public class ImportDemoTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ImportConfig.class);
String[] definitionNames = context.getBeanDefinitionNames();
Arrays.stream(definitionNames).forEach((definitionName) -> System.out.println(definitionName));
}
}
运行结果
示例代码 三: 实现ImportBeanDefinitionRegistrar接口
用registerBeanDefinitions()方法中的BeanDefinitionRegistry对象注入BeanDefinition对象到IOC容器中,实现ImportBeanDefinitionRegistrar接口的类对象本身不会被注册到IOC容器中。
ImportBeanDefinitionRegistrarDemoBean类
package com.yang.SpringTest.annotation.importLearn;
import lombok.Data;
/**
* @author By: chengxuyuanshitang
* Package com.yang.SpringTest.annotation.importLearn
* Ceate Time 2024-03-14 14:19
*/
@Data
public class ImportBeanDefinitionRegistrarDemoBean {
}
ImportBeanDefinitionDemoRegistrar类
package com.yang.SpringTest.annotation.importLearn;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;
/**
* <p>description</p>
*
* @author By: chengxuyuanshitang
* Package com.yang.SpringTest.annotation.importLearn
* Ceate Time 2024-03-14 14:22
*/
public class ImportBeanDefinitionDemoRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
String beanName = ImportBeanDefinitionRegistrarDemoBean.class.getName();
BeanDefinition beanDefinition = new RootBeanDefinition(ImportBeanDefinitionRegistrarDemoBean.class);
registry.registerBeanDefinition(beanName, beanDefinition);
}
}
配置类
package com.yang.SpringTest.annotation.importLearn;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
/**
* <p>配置类 </p>
*
* @author By: chengxuyuanshitang
* Package com.yang.SpringTest.annotation.importLearn
* Ceate Time 2024-03-14 14:01
*/
@Import(value = {ImportBeanDefinitionRegistrarDemoBean.class})
@Configuration
public class ImportConfig {
}
测试类
package com.yang.SpringTest.annotation.importLearn;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import java.util.Arrays;
/**
* <p>测试类</p>
*
* @author By: chengxuyuanshitang
* Package com.yang.SpringTest.annotation.importLearn
* Ceate Time 2024-03-14 14:02
*/
public class ImportDemoTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ImportConfig.class);
String[] definitionNames = context.getBeanDefinitionNames();
Arrays.stream(definitionNames).forEach((definitionName) -> System.out.println(definitionName));
}
}