在应用中,我们会把大量的类注入到IOC中,有时没有把某个类注入到IOC容器中,但在运用的时候需要获取该类对应的bean,此时就需要用到@Import注解。
一. @Import 使用
1.1 @Import 介绍
- 直接导入类
- 通过导入配置类的方式,此时的配置类需要实现 ImportSelector 或者 ImportBeanDefinitionRegistrar
注: @Import导入组件,id默认是组件的全类名
1.2 @Import 使用
1.2.1 定义几个Bean
此时并没有注入到 IOC 容器中
@Data
public class SuperMan {
private String name;
private Integer age;
}
---------
@Data
public class Man {
private String userName;
private String email;
}
--------
@Data
public class Bule {
private Integer code;
}
1.2.2 使用@Import注入
@Configuration
@Import({SuperMan.class, SuperSelector.class,MyDefinitionRegistrar.class})
public class MainConfig {
}
MyDefinitionRegistrar、 SuperSelector是通过配置文件的方式
public class MyDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata,
BeanDefinitionRegistry beanDefinitionRegistry) {
boolean beanDefinition = beanDefinitionRegistry.containsBeanDefinition("com.javayh.api.bean.SuperMan");
if(beanDefinition){
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Bule.class);
beanDefinitionRegistry.registerBeanDefinition("bule",rootBeanDefinition);
// beanDefinitionRegistry.removeBeanDefinition("com.javayh.api.bean.Man");
}
}
}
public class SuperSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[]{
"com.javayh.api.bean.Man"
};
}
}
1.3 验证
public class TestMain {
AnnotationConfigApplicationContext applicationContext =
new AnnotationConfigApplicationContext(MainConfig.class);
@Test
public void testImport(){
printBeans(applicationContext);
SuperMan bean = applicationContext.getBean(SuperMan.class);
Man man = applicationContext.getBean(Man.class);
Bule bule = applicationContext.getBean(Bule.class);
System.out.println(bean);
System.out.println(man);
System.out.println(bule);
}
private void printBeans(AnnotationConfigApplicationContext applicationContext){
String[] definitionNames = applicationContext.getBeanDefinitionNames();
for (String name : definitionNames) {
System.out.println(name);
}
}
}
如下图:在我们使用的时候已经将其注入到IOC中
这是我们可以 将 @Import 注释掉,或者打开注释掉的代码,在运行
如果您打开注释掉的代码,会发现,出现下方的错误!
二.扩展
@Import在SpringBoot底层应用的很多,如下图
接下来我们看一下源代码
public class AutoConfigurationImportSelector
implements DeferredImportSelector,
BeanClassLoaderAware, ResourceLoaderAware,
BeanFactoryAware, EnvironmentAware, Ordered {
}
发现实现了很多接口,其中有 DeferredImportSelector
导入选择器,而DeferredImportSelector
又继承了ImportSelector
public interface ImportSelector {
String[] selectImports(AnnotationMetadata var1);
}
本文的分享暂时就到这里,希望对您有所帮助
关注 Java有货领取更多资料
联系小编。微信:372787553,带您进群互相学习
左侧小编微信,右侧获取免费资料
- SpringCloud 自定义封装架构https://github.com/Dylan-haiji/javayh-platform
- Java 设计模式学习代码 https://github.com/Dylan-haiji/design-pattern
- SpringCloud学习代码: https://github.com/Dylan-haiji/javayh-cloud
- AlibabaCloud学习代码:https://github.com/Dylan-haiji/javayh-cloud-nacos
- SpringBoot+Mybatis 多数据源切换:https://github.com/Dylan-haiji/javayh-boot-data-soure
- Redis、Mongo、Rabbitmq、Kafka学习代码: https://github.com/Dylan-haiji/javayh-middleware
- SpringBoot+SpringSecurity实现自定义登录学习代码:https://github.com/Dylan-haiji/javayh-distribution