springboot~注(zhu)冊不(bu)同級(ji)別包里(li)的bean~ImportSelector
上次回說了@SpringBootApplication里的scanBasePackages里來實現不同級別包的加載問題,而這次主要說一下ImportSelector來實現加載不同包的方法,事實上,在springboot里,所有的Enable開頭的組件也是使用的這種方式來實現的。
nacos組件里的體現

異步組件里的體現

@SpringBootApplication注解里也實現了@ComponentScan,所以scanBasePackages其(qi)實就是@ComponentScan里的basePackages參數
ImportSelector實現不同包的加載
首先,定義一個需要的bean對象(xiang),比如一個monodb的配置對象(xiang)
@Configuration
public class MongodbConfig {
public void print() {
System.out.println("hello mongodb!");
}
}
之后,對這個對象進(jin)行一個ImportSelector接(jie)口的實現
public class MongodbSelector implements ImportSelector {
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[]{MongodbConfig.class.getName()};
}
}
最后,按著springboot一慣的作用,添加呈(cheng)個(ge)Enable的注解,以向外界開啟它
/**
* 自定義注釋,引用不同包里的配置默認項.
*/
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target(ElementType.TYPE)
@Import(MongodbSelector.class)
public @interface EnableMongodb {
}
然后在對象的項(xiang)目(mu)main方(fang)法的入口類上,開高這個注(zhu)解
@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都被打印出來了。

最后,再總結(jie)一下(xia),一般我(wo)們在開(kai)發(fa)自定義的start包時,都使用了ImportSelector類。