Spring中ImportSelector接口的作用
@Import()註解的作用:
當我們需要導入某個類到spring容器中去,但spring恰好無法掃描到這個類,而我們又無法修改這個類
(jar包形式)。我們就可以通過@import(xxx.class)是將這個類導入到spring容器中。
寫一個例子;
創建一個Test類:
//不加任何註解或配置bean.xml,僅僅表示一個外部類,與spring無關的。
public class Test {
}
接着創建MySelector類實現ImportSelector接口:
////不加任何註解或配置bean.xml,僅僅表示一個外部類,與spring無關的。
public class MySelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[]{Test.class.getName()};//數組中放入需要引入spring中的類名
}
}
然後創建一個自定義註解 @EnableTest:
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(MySelector.class)//引入MySelector.class
public @interface EnableTest {
}
最後創建一個App用來測試:
@EnableTest//這裏加上EnableTest註解
public class App {
public static void main(String[] args) {
AnnotationConfigApplicationContext ac=new AnnotationConfigApplicationContext(App.class);
System.out.println(ac.getBean(Test.class));//測試是否能夠從容器中獲取到外部的Test的對象。
}
}
測試結果肯定是能夠獲取到的!
爲什麼要使用ImportSelector?
ImportSelector在SpringBoot中大量被使用,各種@EnableXXX註解表示開啓XXX,這些註解基本上都是使用了@Import註解導入一個ImportSelector。
比如需要開啓Eureka,開啓Nacos,只需要簡單的一行註解就能搞定。