• 10、组件注册-@Import-使用ImportBeanDefinitionRegistrar


    10、组件注册-@Import-使用ImportBeanDefinitionRegistrar

    public interface ImportBeanDefinitionRegistrar {
    
    	/**
    	 * Register bean definitions as necessary based on the given annotation metadata of
    	 * the importing {@code @Configuration} class.
    	 * <p>Note that {@link BeanDefinitionRegistryPostProcessor} types may <em>not</em> be
    	 * registered here, due to lifecycle constraints related to {@code @Configuration}
    	 * class processing.
    	 * @param importingClassMetadata annotation metadata of the importing class
    	 * @param registry current bean definition registry
    	 */
    	public void registerBeanDefinitions(
    			AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry);
    
    }
    

    10.1 实现ImportBeanDefinitionRegistrar 并重写 registerBeanDefinitionsfan方法

    package com.hw.springannotation.conditional;
    
    import com.hw.springannotation.beans.RainBow;
    import org.springframework.beans.factory.config.BeanDefinition;
    import org.springframework.beans.factory.support.BeanDefinitionRegistry;
    import org.springframework.beans.factory.support.RootBeanDefinition;
    import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
    import org.springframework.core.type.AnnotationMetadata;
    
    /**
     * @Description TODO
     * @Author hw
     * @Date 2018/11/28 16:16
     * @Version 1.0
     */
    public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
        /**
         * @param importingClassMetadata annotation metadata of the importing class 当前类的注解信息
         * @param registry               current bean definition registry   定义的注册类
         *                               所有需要添加到容器中的bean BeanDefinitionRegistry.registerBeanDefinition 手动注册进来
         */
        public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
            boolean red = registry.containsBeanDefinition("com.hw.springannotation.beans.Red");
            boolean blue = registry.containsBeanDefinition("com.hw.springannotation.beans.Blue");
    
            if (red && blue) {
                // 指定Bean的定义信息,Bean的类型,作用域等
                BeanDefinition beanDefinition = new RootBeanDefinition(RainBow.class);
                // 注册一个Bean,指定bean名
                registry.registerBeanDefinition("rainBow", beanDefinition);
            }
        }
    }
    
    

    10.2 使用

    新建RainBow类,并在MainConfig中导入MyImportBeanDefinitionRegistrar.class

    @Import({Color.class, Red.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
    
    

    10.3 测试

  • 相关阅读:
    【IDEA插件】—— 代码量统计工具Statistic
    【Funny Things】001——QQ循环发送消息
    【jmeter测试范例】001——TCP测试
    【Jmeter源码解读】003——TCP采样器代码解析
    【Jmeter源码解读】002——程序入口类NewDriver.java
    Eclipse点击空格总是自动补全代码怎么办,如何自动补全代码,代码提示
    路径中关于斜杠/和反斜杠 的区别
    eclipse查看JDK源码
    Navicat premium如何使用Oracle的OCI
    斐波那契查找不再迷惑
  • 原文地址:https://www.cnblogs.com/Grand-Jon/p/10025358.html
Copyright © 2020-2023  润新知