上次回說了@SpringBootApplication里的scanBasePackages里來實現不同級別包的加載問題,而這次主要說一下ImportSelector來實現加載不同包的方法,事實上,在springboot里,所有的Enable開頭的組件也是使用的這種方式來實現的。
nacos組件里的體現
異步組件里的體現
@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都被打印出來了。
最后,再總結一下,一般我們在開發自定義的start包時,都使用了ImportSelector類。