博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
精通 Spring 源码 | ImportSelector
阅读量:4107 次
发布时间:2019-05-25

本文共 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

演示完毕

—— 完

ABOUT

公众号:【星尘Pro】

github:

推荐阅读

转载地址:http://bffsi.baihongyu.com/

你可能感兴趣的文章
JS对浏览器Cookie的操作,查询、设置以及删除
查看>>
生成excel控制类
查看>>
hdu1231(最大连续子序列)
查看>>
32位机器的LowMemory
查看>>
数据之路 - Python爬虫 - 动态页面
查看>>
MQTT学习之协议介绍
查看>>
读书笔记--《编写高质量代码:改善Python程序的91个建议》
查看>>
[Leetcode] 寻找数组的中心索引
查看>>
kubernetes(k8s)架构及核心概念
查看>>
RF学习笔记
查看>>
[codeforces] 25E Test || hash
查看>>
Tomcat之web项目部署
查看>>
Python expandtabs() 方法
查看>>
【NOIP模拟】机器人
查看>>
css书写顺序
查看>>
JavaScript动画缓冲算法总结 转
查看>>
P1297: [SCOI2009]迷路
查看>>
C# WinForm开发系列 - File
查看>>
Xtreme Toolkit Pro 安装编译详解
查看>>
在Hadoop集群中添加机器和删除机器
查看>>