一、ImportBeanDefinitionRegistrar类介绍

  ImportBeanDefinitionRegistrar类通过其他@Configuration类通过@Import的方式来加载,通常是启动类或配置类。
  然后会调用该接口方法,将其中要注册的类注册成bean。
  通过实现该接口的类拥有注册bean的能力。
  可以实现遗下Aware接口
    EnvironmentAware
    BeanFactoryAware
    BeanClassLoaderAware
    ResourceLoaderAware

二、实现注册指定类型的Bean

1)定义一个需要用来注册的service类

/**
* @author zhangboqing
* @date 2019/12/13
*/
@Slf4j
public class HelloService {
public void sayHello() {
log.info("Hello!!!");
}
}

2)定义HelloImportBeanDefinitionRegistrar类实现ImportBeanDefinitionRegistrar接口

/**
* @author zhangboqing
* @date 2019/12/13
*/
public class HelloImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { @Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
// 扫描注解
Map<String, Object> annotationAttributes = importingClassMetadata.getAnnotationAttributes(ComponentScan.class.getName());
String[] basePackages = (String[]) annotationAttributes.get("basePackages"); // 扫描类
ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(registry, false);
// 指定类
TypeFilter helloServiceFilter = new AssignableTypeFilter(HelloService.class);
scanner.addIncludeFilter(helloServiceFilter);
scanner.scan(basePackages);
}
}

3)定义HelloConfiguration配置类,引入ImportBeanDefinitionRegistrar

/**
* @author zhangboqing
* @date 2019/12/13
*/
@Configuration
@ComponentScan("com.zbq.springbootdemo.speciality.dynamicRegisterBean.ImportBeanDefinitionRegistrar")
@Import(HelloImportBeanDefinitionRegistrar.class)
public class HelloConfiguration {
}

4)定义测试类可验证HelloService类是否注册成功

/**
* @author zhangboqing
* @date 2019/12/13
*/
@SpringBootTest(classes = {HelloConfiguration.class})
// 指定配置类
//@ContextConfiguration(classes = {HelloConfiguration.class})
public class HelloImportBeanDefinitionRegistrarTest { @Autowired
private HelloService helloService; @Test
public void testHelloService() {
helloService.sayHello();
}
}

三、实现注册指定注解的Bean

1)自定义注解HelloAnnotation

/**
* @author zhangboqing
* @date 2019/12/13
*/
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface HelloAnnotation {
}

2)将注解加入到HelloService类上

/**
* @author zhangboqing
* @date 2019/12/13
*/
@Slf4j
@HelloAnnotation
public class HelloService {
public void sayHello() {
log.info("Hello!!!");
}
}

3)修改HelloImportBeanDefinitionRegistrar类,将类型过滤器从指定类型变为指定注解

/**
* @author zhangboqing
* @date 2019/12/13
*/
public class HelloImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { @Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
// 扫描注解
Map<String, Object> annotationAttributes = importingClassMetadata.getAnnotationAttributes(ComponentScan.class.getName());
String[] basePackages = (String[]) annotationAttributes.get("basePackages"); // 扫描类
ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(registry, false);
// 指定类
// TypeFilter helloServiceFilter = new AssignableTypeFilter(HelloService.class);
// 指定注解
TypeFilter helloServiceFilter = new AnnotationTypeFilter(HelloAnnotation.class);
scanner.addIncludeFilter(helloServiceFilter);
scanner.scan(basePackages);
}
}

4)用上面的测试类再次验证,同样可以

【Spring Boot】Spring Boot之使用ImportBeanDefinitionRegistrar类实现动态注册Bean的更多相关文章

  1. 【Spring Boot】Spring Boot之使用ImportSelector类实现动态注册Bean

    一.ImportSelector类介绍     可以通过指定的选择条件来决定哪些类被注册到Spring中.与ImportBeanDefinitionRegistrar类功能相似,通过@Import的方 ...

  2. SpringBoot27 JDK动态代理详解、获取指定的类类型、动态注册Bean、接口调用框架

    1 JDK动态代理详解 静态代理.JDK动态代理.Cglib动态代理的简单实现方式和区别请参见我的另外一篇博文. 1.1 JDK代理的基本步骤 >通过实现InvocationHandler接口来 ...

  3. 【Spring注解驱动开发】在@Import注解中使用ImportBeanDefinitionRegistrar向容器中注册bean

    写在前面 在前面的文章中,我们学习了如何使用@Import注解向Spring容器中导入bean,可以使用@Import注解快速向容器中导入bean,小伙伴们可以参见<[Spring注解驱动开发] ...

  4. 基于ImportBeanDefinitionRegistrar和FactoryBean动态注入Bean到Spring容器中

    基于ImportBeanDefinitionRegistrar和FactoryBean动态注入Bean到Spring容器中 一.背景 二.实现方案 1.基于@ComponentScan注解实现 2.基 ...

  5. Spring动态注册bean实现动态多数据源

    Spring动态注册bean实现动态多数据源 http://blog.csdn.net/littlechang/article/details/8071882

  6. spring boot 动态注入bean

    方法一 SpringContextUtil public class SpringContextUtil { private static ApplicationContext application ...

  7. 使用spring配置类代替xml配置文件注册bean类

    spring配置类,即在类上加@Configuration注解,使用这种配置类来注册bean,效果与xml文件是完全一样的,只是创建springIOC容器的方式不同: //通过xml文件创建sprin ...

  8. Spring之2:Spring Bean动态注册、删除

    IoC容器的初始化包括BeanDefinition的Resource定位.载入和注册这三个基本的过程. 一.Resource定位.BeanDefinition的资源定位有resourceLoader通 ...

  9. 【String注解驱动开发】面试官让我说说:如何使用FactoryBean向Spring容器中注册bean?

    写在前面 在前面的文章中,我们知道可以通过多种方式向Spring容器中注册bean.可以使用@Configuration结合@Bean向Spring容器中注册bean:可以按照条件向Spring容器中 ...

随机推荐

  1. mysql从命令行执行sql语句

    mysql -u root -p -e "create database mydb;"

  2. 初学JavaScript正则表达式(十一)

    JavaScript的对象属性 整理自慕课网教学 点此进入

  3. Jmeter Question 之 ‘批量执行SQL语句’

    第一步: MySql数据库:jdbc:mysql://ip:3306/数据库名?useUnicode=true&characterEncoding=utf8&allowMultiQue ...

  4. 201271050130-滕江南《面向对象程序设计(java)》第十一周学习总结

    项目 内容 <面向对象程序设计(java)> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/ ...

  5. IntelliJ IDEA安装与破解教程(一)

    官网地址:https://www.jetbrains.com/idea/ IntelliJ IDEA分为:旗舰版(Ultimate).社区版(Community) 旗舰版是收费的,社区版则是免费的.旗 ...

  6. GitHub 注册失败的原因 以及解决 。

    1.注册的时候老是卡在第一步: 提交用户名和密码 还有邮箱的时候 提交成功后. 不跳出 第二步.若现在去登录账号和密码,不管输对的还是输错的都是显示错误的.2.查看GitHub官网帮助后,不难发现问题 ...

  7. javaScript___计算时间前一天和后一天案例

    1.  HTML 排版 <button onclick="anteayer()">前天</button> <button onclick=" ...

  8. Vue学习记录(二)-打包问题

    由于项目需要,vue项目在build打包 之后,希望有一个类似wbeconfig的配置文件.方便判断应用所处的环境.进行相应的逻辑处理. 这边暂时记录一下思路,具体请看友情链接. 方案一:从环境变量下 ...

  9. Qt+FFmpeg 简单实现视频播放

    这里使用 Qt + FFmpeg 实现了一个简单播放视频的例子.先看下按下按钮播放视频时的效果图: 完整工程下载链接:Github-FFmpeg_demo 注意:一定要将 bin 目录下的 dll 文 ...

  10. sso单点登录的入门(Session跨域、Spring-Session共享)

    1.单点登录,就是多系统,单一位置登录,实现多系统同时登录的一种技术.单点登录一般是用于互相授信的系统,实现单一位置登录,全系统有效的. 区分与三方登录(第三方登录) ,三方登录:某系统,使用其他系统 ...