Import注解

导读:本篇文章讲解 Import注解,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

五、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

(0)

相关推荐

半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!