五、Import注解
向Spring容器中注册bean
1、@Configuration注解结合@Bean注解向Spring容器中注册bean;
2、可以按照条件向Spring容器中注册bean;(Conditional)
3、可以使用@Import注解向容器中快速导入bean对象;可以在@Import注解中使用ImportBeanDefinitionRegistrar向容器中注册bean。
4、向容器中注册Bean,实现FactoryBean<>接口;
1、使用@Import注解给容器中快速导入一个组件
Import源码:
@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();
}
可以多个导入,也可以单个导入;由源码可知,数组;
@Import({Color.class, Red.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})// @Import快速地导入组件,id默认是组件的全类名
2、在@Import注解中使用ImportSelector接口导入bean
ImportSelector接口是Spring中导入外部配置的核心接口,在Spring Boot的自动化配置和@EnableXXX(功能性注解)都有它的存在。我们先来看一下ImportSelector接口的源码,如下所示。
在ImportSelector接口的selectImports()方法中,存在一个AnnotationMetadata类型的参数,这个参数能够获取到当前标注@Import注解的类的所有注解信息,也就是说不仅能获取到@Import注解里面的信息,还能获取到其他注解的信息。
首先,我们创建一个MyImportSelector类实现ImportSelector接口,使用Import将MyImportSelector类注册到Import中;ImportSelect返回的是一个数组;
注意:Import的id默认是组件的全类名;所以:要想用ImportSelector接口,必须写全类名;
public class MyImportSelector implements ImportSelector {
// 返回值:就是要导入到容器中的组件的全类名
// AnnotationMetadata:当前标注@Import注解的类的所有注解信息,也就是说不仅能获取到@Import注解里面的信息,还能获取到其他注解的信息
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.baidu.bean.Blue","com.baidu.bean.Yellow"};// 可以返回一个空数组
}
}
3、在@Import注解中使用ImportBeanDefinitionRegistrar向容器中注册bean
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
/**
* AnnotationMetadata:当前类的注解信息
* BeanDefinitionRegistry:BeanDefinition注册类
*
* 我们可以通过调用BeanDefinitionRegistry接口中的registerBeanDefinition方法,手动注册所有需要添加到容器中的bean
*/
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
//容器中同时拥有Blue,和Yellow 在向容器中添加rainBow
boolean definition = registry.containsBeanDefinition("com.baidu.bean.Blue");
boolean definition2 = registry.containsBeanDefinition("com.baidu.bean.Yellow");
if (definition && definition2){
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(RainBow.class);
registry.registerBeanDefinition("rainBow",rootBeanDefinition);
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/71823.html