• springboot~注册不同级别包里的bean~ImportSelector


    上次回说了@SpringBootApplication里的scanBasePackages里来实现不同级别包的加载问题,而这次主要说一下ImportSelector来实现加载不同包的方法,事实上,在springboot里,所有的Enable开头的组件也是使用的这种方式来实现的。
    nacos组件里的体现
    nacos
    异步组件里的体现
    async

    @SpringBootApplication注解里也实现了@ComponentScan,所以scanBasePackages其实就是@ComponentScan里的basePackages参数

    ImportSelector实现不同包的加载

    首先,定义一个需要的bean对象,比如一个monodb的配置对象

    @Configuration
    public class MongodbConfig {
        public void print() {
            System.out.println("hello mongodb!");
        }
    }
    

    之后,对这个对象进行一个ImportSelector接口的实现

    public class MongodbSelector implements ImportSelector {
        public String[] selectImports(AnnotationMetadata annotationMetadata) {
            return new String[]{MongodbConfig.class.getName()};
        }
    }
    

    最后,按着springboot一惯的作用,添加呈个Enable的注解,以向外界开启它

    /**
     * 自定义注释,引用不同包里的配置默认项.
     */
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Target(ElementType.TYPE)
    @Import(MongodbSelector.class)
    public @interface EnableMongodb {
    }
    

    然后在对象的项目main方法的入口类上,开高这个注解

    @SpringBootApplication(scanBasePackages = {"com.lind.nacosdemo", "com.lind.redis"})
    @EnableDiscoveryClient
    @EnableMongodb
    public class NacosDemoApplication {
        public static void main(String[] args) {
            SpringApplication.run(NacosDemoApplication.class, args);
        }
    }
    

    最后测试的结果如下,我们之前的redis和现在的mongodb都被打印出来了。
    test
    最后,再总结一下,一般我们在开发自定义的start包时,都使用了ImportSelector类。

  • 相关阅读:
    How to read a whole document content into a string onetime
    how to get the Authorization of adobe acrobat 8.0 for free
    给求职的同学的几点建议
    select() manul select() 手册
    有无一步登天之法?
    VB6.0 Excel模版,自己設定好分析餅圖,如何動態地更新分析圖的數據源呢?
    C#中的委托和事件(续)
    C# 中的委托和事件
    VB6.0 Excel的動態生成多個Sheet的方法
    VB6.0 用Excel生成數據分析餅圖例子
  • 原文地址:https://www.cnblogs.com/lori/p/13084967.html
Copyright © 2020-2023  润新知