本文共 1960 字,大约阅读时间需要 6 分钟。
ImportSelector 是Spring的扩展点之一,这个扩展点有什么用呢,如果说在 SpringBoot 中,我们熟悉的 @EnableXXX 就是通过这个扩展点来实现的,下面我们来进行分析和实现。
下面是他的源码,在 Spring 中是一个接口,具体有什么用呢
public interface ImportSelector { /** * Select and return the names of which class(es) should be imported based on * the {@link AnnotationMetadata} of the importing @{@link Configuration} class. */ String[] selectImports(AnnotationMetadata importingClassMetadata);}
她提供了一个方法 selectImports 可以返回一个字符串数组,Spring 会把这个数组里面的对象注入到 Spring 容器中去,所以,我们可以灵活的实现 @EnableXXX 的功能。下面我们来实现一个例子。
定义需要注入的类,我们定义了两个类 UserDao 和 IndexDao,UserDao 注入容器,IndexDao 不注入容器
@Componentpublic class UserDao {}
public class IndexDao {}
我们再定义一个 MyImportSelector 实现 ImportSelector ,这里动态返回了 IndexDao ,说明会把这个类注入到 Spring 容器中去。
public class MyImportSelector implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata importingClassMetadata) { return new String[]{IndexDao.class.getName()}; }}
我们再来自定义一个注解,@Import 表明会把 MyImportSelector.class 注入到容器中去,所以这里我们定义的 @EnableHly 就一个开关,是否把 IndexDao 注入到容器中。
@Import(MyImportSelector.class)@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)public @interface EnableHly {}
最后再定义我们的配置类 ,@EnableHly 打开开关,才会注入 IndexDao 。
@Configuration@ComponentScan("com.javahly.spring26")@EnableHlypublic class AppConfig {}
测试
public class Test { public static void main(String[] args) { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); System.out.println(applicationContext.getBean(UserDao.class)); System.out.println(applicationContext.getBean(IndexDao.class)); }}
如果使用 @EnableHly 打开开关,则正常输出
com.javahly.spring26.dao.UserDao@1888ff2ccom.javahly.spring26.dao.IndexDao@35851384
否则,报错
com.javahly.spring26.dao.UserDao@6ea6d14eException in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.javahly.spring26.dao.IndexDao' available
演示完毕
—— 完
公众号:【星尘Pro】
github:
推荐阅读
转载地址:http://bffsi.baihongyu.com/