【Spring Boot】Spring Boot之使用ImportSelector类实现动态注册Bean
一、ImportSelector类介绍
可以通过指定的选择条件来决定哪些类被注册到Spring中。与ImportBeanDefinitionRegistrar类功能相似,通过@Import的方式来加载。
也可以实现遗下Aware接口
EnvironmentAware
BeanFactoryAware
BeanClassLoaderAware
ResourceLoaderAware
使用方式和ImportBeanDefinitionRegistrar一样通过@Import注解加载
二、实现自定义的ImportSelector类
解决的核心问题:如何指定我们想要加载的类
1)第一种方式,在当前类中指定要加载的类
/**
* @author zhangboqing
* @date 2019/12/18
*/
public class HelloImportSelector implements ImportSelector { private static final String[] IMPORTS = {
HelloService.class.getName(),
}; @Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return IMPORTS;
}
}
2)第二种方式,加载META-INF/spring.factories中指定key对应的类
1、定义SpringFactoryImportSelector<T>类
/**
* @author zhangboqing
* @date 2019/12/18
*/
public class SpringFactoryImportSelector<T> implements DeferredImportSelector, BeanClassLoaderAware { private Class annotationClass; private ClassLoader beanClassLoader; protected SpringFactoryImportSelector() {
// 用来获取泛型注解类即T代表的类型
this.annotationClass = (Class<T>) GenericTypeResolver
.resolveTypeArgument(this.getClass(), SpringFactoryImportSelector.class);
} @Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
// 加载META-INF/spring.factories中key为HelloAnnotation注解对应的value类
List<String> factories = new ArrayList<>(new LinkedHashSet<>(SpringFactoriesLoader
.loadFactoryNames(this.annotationClass, this.beanClassLoader))); return factories.toArray(new String[factories.size()]);
} @Override
public void setBeanClassLoader(ClassLoader classLoader) {
this.beanClassLoader = classLoader;
} }
2、定义MySpringFactoryImportSelector,用来实现SpringFactoryImportSelector,指定对应的注解
/**
* @author zhangboqing
* @date 2019/12/18
*/
public class MySpringFactoryImportSelector extends SpringFactoryImportSelector<HelloAnnotation> { }
或者在类中指定注解
/**
* @author zhangboqing
* @date 2019/12/18
*/
public class HelloAnnotationSpringFactoryImportSelector implements DeferredImportSelector, BeanClassLoaderAware { private Class annotationClass = HelloAnnotation.class; private ClassLoader beanClassLoader; @Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
// 加载META-INF/spring.factories中key为HelloAnnotation注解对应的value类
List<String> factories = new ArrayList<>(new LinkedHashSet<>(SpringFactoriesLoader
.loadFactoryNames(this.annotationClass, this.beanClassLoader))); return factories.toArray(new String[factories.size()]);
} @Override
public void setBeanClassLoader(ClassLoader classLoader) {
this.beanClassLoader = classLoader;
} }
【Spring Boot】Spring Boot之使用ImportSelector类实现动态注册Bean的更多相关文章
- 【Spring Boot】Spring Boot之使用ImportBeanDefinitionRegistrar类实现动态注册Bean
一.ImportBeanDefinitionRegistrar类介绍 ImportBeanDefinitionRegistrar类通过其他@Configuration类通过@Import的方式来加载, ...
- SpringBoot27 JDK动态代理详解、获取指定的类类型、动态注册Bean、接口调用框架
1 JDK动态代理详解 静态代理.JDK动态代理.Cglib动态代理的简单实现方式和区别请参见我的另外一篇博文. 1.1 JDK代理的基本步骤 >通过实现InvocationHandler接口来 ...
- Spring动态注册bean实现动态多数据源
Spring动态注册bean实现动态多数据源 http://blog.csdn.net/littlechang/article/details/8071882
- spring boot 动态注入bean
方法一 SpringContextUtil public class SpringContextUtil { private static ApplicationContext application ...
- 使用spring配置类代替xml配置文件注册bean类
spring配置类,即在类上加@Configuration注解,使用这种配置类来注册bean,效果与xml文件是完全一样的,只是创建springIOC容器的方式不同: //通过xml文件创建sprin ...
- Spring之2:Spring Bean动态注册、删除
IoC容器的初始化包括BeanDefinition的Resource定位.载入和注册这三个基本的过程. 一.Resource定位.BeanDefinition的资源定位有resourceLoader通 ...
- 【Spring注解驱动开发】在@Import注解中使用ImportBeanDefinitionRegistrar向容器中注册bean
写在前面 在前面的文章中,我们学习了如何使用@Import注解向Spring容器中导入bean,可以使用@Import注解快速向容器中导入bean,小伙伴们可以参见<[Spring注解驱动开发] ...
- 【String注解驱动开发】如何按照条件向Spring容器中注册bean?这次我懂了!!
写在前面 当bean是单实例,并且没有设置懒加载时,Spring容器启动时,就会实例化bean,并将bean注册到IOC容器中,以后每次从IOC容器中获取bean时,直接返回IOC容器中的bean,不 ...
- 使用Spring容器动态注册和获取Bean
有时候需要在运行时动态注册Bean到Spring容器,并根据名称获取注册的Bean.比如我们自己的SAAS架构的系统需要调用ThingsBoard API和Thingsboard交互,就可以通过Thi ...
随机推荐
- [Go] 使用go mod安装beego
需要go升级到1.12或以上 mkdir gomodtest cd gomodtest go mod init gomodtest 创建一个server.go package main import ...
- MATLAB常见的学习率下降策略
MATLAB常见的学习率下降策略 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. 几种常见的学习率下降策略(learning rate decay st ...
- matplotlib画3D图修改X,Y,Z,colorbar的刻度值
修改X,Y,Z轴的刻度值 from matplotlib.ticker import MultipleLocator,FuncFormatter from mpl_toolkits.mplot3d i ...
- 深入理解JavaScript中的作用域和上下文
介绍 JavaScript中有一个被称为作用域(Scope)的特性.虽然对于许多新手开发者来说,作用域的概念并不是很容易理解,我会尽我所能用最简单的方式来解释作用域.理解作用域将使你的代码脱颖而出,减 ...
- C++中的异常处理(下)
array.h #ifndef _ARRAY_H_ #define _ARRAY_H_ #include <stdexcept> using namespace std; template ...
- Linux上发布E卡通项目
Linux上发布E卡通项目 使用的命令 ps -ef | grep java kill -9 22314 nohup java -jar smartcard-ms-0.0.1-SNAPSHOT.jar ...
- Vue的模板语法(四)
一.插值 1. 文本 数据绑定最常见的形式就是使用“Mustache”语法 (双大括号) 的文本插值: <span>Message: {{ msg }}</span> Must ...
- django-订单并发处理--悲观锁和乐观锁
冲突比较少的时候,使用乐观锁. 冲突比较多的时候,使用悲观锁. (1) 悲观锁 select * from df_goods_sku where id=17 for update; 悲观锁获取 ...
- vue2.x 监听数据变化 ---- watch
computed: { //需要监听的数据 loginToken () { return this.$store.state.userinfo.status; } }, watch: { loginT ...
- 2019 SDN上机第二次作业
2019 SDN上机第二次作业 1.利用mininet创建如下拓扑,要求拓扑支持OpenFlow 1.3协议,主机名.交换机名以及端口对应正确,请给出拓扑Mininet执行结果,展示端口连接情况 1. ...