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類。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM