【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] gocron源码阅读-go语言中的切片和类型综合
在gocron.go文件的main函数中,有下面这一句,从这句代码中可以学习到切片和类型的综合运用 cliApp.Flags = append(cliApp.Flags, []cli.Flag{}.. ...
- Day_05
01.error接口的使用 package main import "fmt" import "errors" func main() { //var err1 ...
- 洛谷P2260 [清华集训2012]模积和(容斥+数论分块)
题意 https://www.luogu.com.cn/problem/P2260 思路 具体思路见下图: 注意这个模数不是质数,不能用快速幂来求逆元,要用扩展gcd. 代码 #include< ...
- selenium python 脚本不支持中文问题
在 python shell 中执行以下脚本: ...... dr.find_element_by_xpath("//a[test()='查看']") ...... 点击 Run ...
- 【CF981F】Round Marriage(二分答案,hall定理)
传送门 题意: 给出一个长度为\(L\)的环,标号从\(0\)到\(L-1\). 之后给出\(n\)个新郎,\(n\)个新娘离起点的距离. 现在新郎.新娘要一一配对,但显然每一对新人的产生都会走一定的 ...
- 报错Error resolving template template might not exist or might not be accessible解决方案
"C:\Program Files\Java\jdk1.8.0_144\bin\java" "-javaagent:D:\IntelliJ IDEA Community ...
- 《RocketMQ》
作为一款消息中间件,RocketMQ需要解决的技术问题其实在分布式系统领域中都有所体现.首先如果将分布式系统的领域按照分布式通信.分布式存储.分布式计算以及分布式管理这四大部分进行划分,其实就会发现在 ...
- FLOPS
FLOPS FLOPS(Float Operations Per Second):每秒浮点运算量,是衡量吞吐率的一个单位,通过折算到具体的浮点操作数量上. 所谓,吞吐率——就如同水管,每秒可以流出多少 ...
- 大话设计模式Python实现-观察者模式
观察者模式(发布-订阅模式 Publish Subscribe Pattern):定义了一种一对多的关系,让多个观察对象同时监听一个主题对象,当主题对象状态发生变化时会通知所有观察者,是它们能够自动更 ...
- QuantLib 金融计算——自己动手封装 Python 接口(1)
目录 QuantLib 金融计算--自己动手封装 Python 接口(1) 概述 QuantLib 如何封装 Python 接口? 自己封装 Python 接口 封装 Array 和 Matrix 类 ...