本文主要是介绍精通 Spring 源码 | ImportSelector,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、简介
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 不注入容器
@Component
public class UserDao {}
public class IndexDao {
}
我们再定义一个 MyImportSelector 实现 ImportSelector ,这里动态返回了 IndexDao ,说明会把这个类注入到 Spring 容器中去。
public class MyImportSelector implements ImportSelector {@Overridepublic 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")
@EnableHly
public 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@1888ff2c
com.javahly.spring26.dao.IndexDao@35851384
否则,报错
com.javahly.spring26.dao.UserDao@6ea6d14e
Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.javahly.spring26.dao.IndexDao' available
演示完毕
—— 完
ABOUT
公众号:【星尘Pro】
github:https://github.com/huangliangyun
推荐阅读
史上最全,最完美的 JAVA 技术体系思维导图总结,没有之一!
全站导航 | 文章汇总!
这篇关于精通 Spring 源码 | ImportSelector的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!