作用
@Import可以用来批量导入需要注册的各种类,如普通的类、配置类,完成普通类和配置类中所有bean注册到spring容器中。
作用范围:作用于类、注解
定义
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
/**
* {@link Configuration @Configuration}, {@link ImportSelector},
* {@link ImportBeanDefinitionRegistrar}, or regular component classes to
import. */
Class<?>[] value();
}
参数
value
:一个Class数组,设置需要导入的类,可以是@Configuration标注的类,也可以是需要导入的普通组件类。
使用
1、导入普通类
@Service
public class UserService {
}
public class UserService2 {
}
@Import({UserService2.class}) //导入了UserService2这个普通类。这个类会被自动注册到spring容器中
@Configuration
public class UserConfig {
}
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(DemoApplication.class, args);
for(String beanName : run.getBeanDefinitionNames()){
System.out.println(beanName);
}
}
}
运行输出:
userService
com.example.demo.service.UserService2
从输出中可以看出UserService2
注入到容器中,UserService2
注入容器中名称为完整的类名。
2、导入@Configuration配置类
@Import
用于@Configuration
配置类,通常在一个项目中有多个模块,而需要在一个模块中引入其它模块的配置类进行使用的情况,如下:
@Configuration
public class ImportConfig {
}
@Import({ImportConfig.class})
@Configuration
public class UserConfig {
}
运行输出:
userService
moduleOne.ImportConfig
从输出中可以看moduleOne
模块中的ImportConfig
类被注入到了Spring容器中。
3、导入@CompontentScan标注的类
在一个项目中可以划分为多个模块,每个模块都是各自独立的包,我们在每个模块所在的包中配置一个@CompontentScan
类,然后通过@Import
来导入需要启用的模块。
模块一
@Component
public class OneService {
}
@ComponentScan
public class OneConfigure {
}
模块二
@Import({OneConfigure.class}) //此处引入了模块一当中的OneConfigure类,这是一个被@ComponentScan标注的扫描类
@Configuration
public class UserConfig {
}
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(DemoApplication.class, args);
for(String beanName : run.getBeanDefinitionNames()){
System.out.println(beanName);
}
}
}
运行部分结果输出:
oneApplication
oneService
从上面输出结果可以看出,OneService
这个bean被注入到了Spring容器中。
4、导入ImportSelector接口类型
ImportSelector
接口只定义了一个selectImports()
方法,用于指定需要注册为bean的Class名称。
使用方法:
- 定义
ImportSelector
接口实现类,在selectImports
返回需要导入的类的名称数组 - 使用
@Import
来导入步骤1中定义的类 - 使用步骤2中
@Import
标的类作为AnnotationConfigApplicationContext
构造参数创建Spring容器 使用
AnnotationConfigApplicationContext
操作bean
public class SelectService {
}
@Configuration
public class SelectConfig {
@Bean
public String hello(){
return "Hello";
}
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{
SelectService.class.getName(),
SelectConfig.class.getName()
};
}
}
@Import({MyImportSelector.class})
public class ImportSelectorConfig {
}
运行测试
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(DemoApplication.class, args);
for(String beanName : run.getBeanDefinitionNames()){
System.out.println(beanName);
}
}
}
运行输出
com.example.demo.service.SelectService
hello
world
从输出中可以看到,SelectService与SelectConfig两个Bean都注入到了Spring容器中。
原创文章,作者:jiafegn,如若转载,请注明出处:https://www.techlearn.cn/archives/85