zoukankan      html  css  js  c++  java
  • 9、组件注册-@Import-使用ImportSelector

    9、组件注册-@Import-使用ImportSelector

    9.1 @Import 源码:

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface Import {
    
    	/**
    	 * {@link Configuration}, {@link ImportSelector}, {@link ImportBeanDefinitionRegistrar}
    	 * or regular component classes to import.
    	 */
    	Class<?>[] value();
    
    }
    

    可以使用ImportSelector来注册组建

    public interface ImportSelector {
    
    	/**
    	 * Select and return the names of which class(es) should be imported based on
    	 * the {@link AnnotationMetadata} of the importing @{@link Configuration} class.
    	 */
    	String[] selectImports(AnnotationMetadata importingClassMetadata);
    
    }
    

    9.2 自定义逻辑返回需要注入的组建

    新建 MyImportSelector implements ImportSelector 重写selectImports 方法。

    package com.hw.springannotation.conditional;
    
    import org.springframework.context.annotation.ImportSelector;
    import org.springframework.core.type.AnnotationMetadata;
    
    /**
     * @Description 自定义逻辑返回需要注入的组建
     * @Author hw
     * @Date 2018/11/28 15:52
     * @Version 1.0
     */
    public class MyImportSelector implements ImportSelector {
        /**
         * 返回值就是需要导入的组建 全类名
         *
         * @param importingClassMetadata 当前标注@Import注解类的所有注解信息
         */
        public String[] selectImports(AnnotationMetadata importingClassMetadata) {
            // 不能返回null
            return new String[]{"com.hw.springannotation.beans.Blue"};
        }
    }
    

    9.3 引入@Import

    @Import({Color.class, Red.class, MyImportSelector.class})    // 快速导入组建,ID 默认是全路径包名
    
    

    9.4 运行测试类

        /**
         * @Import注解
         */
        @Test
        public void testImport() {
            printBeans();
    //        System.exit(0);
        }
    
        private void printBeans(){
            String[] names = applicationContext.getBeanDefinitionNames();
            for (String name : names) {
                System.out.println(name);
            }
        }
    

    结果如图:

  • 相关阅读:
    Verilog语言
    OrCAD --从SNAPEDA导入封装库
    RAM/ROM IP一次性总结
    USB之Main item, Local item和Global item 的作用范围与归类
    发光LED压降与工作电流总结
    C之输入输出函数(3) -- 请使用sscanf()
    C之输入输出函数(2) -- gets()
    C之输入输出函数(1) -- fgets()
    C中的lvalue和rvalue
    关于字符串的一点补充
  • 原文地址:https://www.cnblogs.com/Grand-Jon/p/10025349.html
Copyright © 2011-2022 走看看