SpringBoot 学习笔记 Part03
1. @Import 基本用法回顾
@Import注解的基本用法是在注解属性中加入要导入到容器中的组件字节码,容器中就会自动注册这个组件。简单来说,就是快速给容器中注册组件。
给容器中注册组件的三种方式回顾:
-
包扫描+组件标注注解(@Component/@Controller/@Service/@Repository)
这种方式局限于自己写的,因为在第三方包源码里加注解不那么现实。
-
@Bean
多用于第三包里面的组件。
-
@Import
快速给容器中导入一个组件,id默认是全类名。
2. ImportSelector接口
ImportSelector 作用是返回需要导入的组件的全类名数组,用法可以总结为两个步骤。
第一步:创建ImportSelector接口的实现类,这个类可以自定义逻辑返回需要导入的组件。
参数1 AnnotationMetadata类:
存储了当前标注@Import注解的类的所有注解信息。(即MyConfig.java的信息)
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
//AnnotationMetadata类 存储了当前标注@Import注解的类的所有注解信息
Set<String> annotationTypes = annotationMetadata.getAnnotationTypes();
//返回值为导入到容器中的组件全类名(可以返回一个空数组,但是千万不能返回一个null)
return new String[0];
}
}
返回值可以用组件全类名来导入组件到容器中,这也是ImportSelector的一个重要功能。
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[]{"com.swz.domain.Blue","com.swz.domain.Yellow"};
}
}
annotationMetadata.get*( )方法可以获取所有注解的属性或者所有跟类有关的信息。
第二步:在@Import注解中加入我们新建的自定义导入选择器。
@Import({Car.class,MyImportSelector.class})
@Configuration
public class MyConfig {
}
启动springboot测试一波,没有任何问题。
3. ImportBeanDefinitionRegistrar接口
这个接口和上一个接口比较明显的区别是,上一个接口指定全类名,springboot以全类名为id自动为你创建。而 ImportBeanDefinitionRegistrar 这个接口则是我们手动注册了,包括手动指定bean的id和bean的字节码文件。
步骤也是和前一个接口类似,一共两步。
第一步:创建ImportBeanDefinitionRegistrar 接口的实现类,使用registry.registerBeanDefinition()方法来手动注册组件,其中第一个参数为组件的beanid,第二个参数为一个匿名内部类,传入需要创建的bean的字节码文件。
参数1 AnnotationMetadata类
存储了当前标注@Import注解的类所有注解信息和其他信息(即MyConfig.java的信息)。
参数2 BeanDefinitionRegistry类
BeanDefinition的注册类。可以把所有需要添加到容器中的bean,通过调用registerBeanDefinition手动注册进来。
public class MyBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
//业务逻辑:若容器中有Blue和Yellow对象时,则创建rainbow对象进容器
boolean isContains1 = registry.containsBeanDefinition("com.swz.domain.Blue");
boolean isContains2 = registry.containsBeanDefinition("com.swz.domain.Yellow");
if(isContains1 && isContains2){
registry.registerBeanDefinition("rainbow",new RootBeanDefinition(Rainbow.class));
}
}
}
第二步:在@Import注解中加入我们新建的自定义Bean注册器。
@Import({Car.class,MyImportSelector.class,MyBeanDefinitionRegistrar.class})
@Configuration
public class MyConfig {
}
启动springboot测试一下,没有问题。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/84480.html