在应用中,我们会把大量的类注入到IOC中,有时没有把某个类注入到IOC容器中,但在运用的时候需要获取该类对应的bean,此时就需要用到@Import注解。
一. @Import 使用
1.1 @Import 介绍
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);
}
在实际项目中我们也经常会用到@Import注解,更多实战应用请看:
https://github.com/Dylan-haiji/javayh-platform/tree/master/javayh-dependencies/javayh-common-starter/src/main/java/com/javayh/common/selector
1.JVM 调优实战
2.Spring Aop实战案例二
3.程序员都在读的书,你也不能错过哦!
4.Java设计模式之策略者模式
5.Redis之缓存穿透与缓存击穿
6.Redis之缓存雪崩
7.Docker三剑客Compose命令介绍与使用
8.JDK14的重大更新
小编寄语
小编创建了一个关于Java学习讨论的微信群!想进去的可以联系小编!同时也欢迎大家点赞与转发!
小编微信:372787553
备注为进群,通过后小编会邀请您进群!