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,只需要简单的一行注解就能搞定。