手动注册bean的两种方式:

实现ImportBeanDefinitionRegistrar
实现BeanDefinitionRegistryPostProcessor

1.实现ImportBeanDefinitionRegistrar

ImportBeanDefinitionRegistrar其本质也是通过BeanDefinitionRegistryPostProcessor来实现的。实现ImportBeanDefinitionRegistrar比较简单,也有多种方式,下面这个是最简单的手动注册bean的方式。

1.1 手动创建BeanDefinition

public class Foo {public void foo() {System.out.println("Foo.foo() invoked!");}
}public class FooImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {BeanDefinitionBuilder bdb = BeanDefinitionBuilder.genericBeanDefinition(Foo.class);BeanDefinition bd = bdb.getBeanDefinition();registry.registerBeanDefinition("foo", bd);}
}@SpringBootApplication
@Import(FooImportBeanDefinitionRegistrar.class)
public class Main implements CommandLineRunner {@Autowiredprivate Foo foo;public static void main(String[] args) {SpringApplication.run(Main.class, args);}@Overridepublic void run(String... args) throws Exception {foo.foo();}}

Foo.foo() invoked!

1.2ClassPathBeanDefinitionScanner

public class FooImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(registry);scanner.addIncludeFilter(new AssignableTypeFilter(Foo.class));scanner.scan("com.study.bootwebsimple.register");//类和包必须都注入}
}

1.3扫描自定义注解

一般都是扫描自定义的注解,才会继承ClassPathBeanDefinitionScanner)。这里你可以扫描自定义的注解,生成BeanDefinition(或其代理)的定义,然后注册到spring容器中。实现代码可以参考Mybatis的
org.mybatis.spring.annotation.MapperScannerRegistrar类,Mybatis扫描Mapper注解,通过MapperFactoryBean来代理了Mapper,并将其注册到spring中

2.实现BeanDefinitionRegistryPostProcessor

@Data
public class Person {private String name;public void foo() {System.out.println("Person.foo() invoked!");}
}public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {BeanDefinitionBuilder bdb = BeanDefinitionBuilder.rootBeanDefinition(Person.class);bdb.addPropertyValue("name", "lipo");registry.registerBeanDefinition("person", bdb.getBeanDefinition());}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {}
}@SpringBootApplication
@Import({FooImportBeanDefinitionRegistrar.class, MyBeanDefinitionRegistryPostProcessor.class})
public class Main implements CommandLineRunner {@Autowiredprivate Foo foo;@Autowiredprivate Person person;public static void main(String[] args) {SpringApplication.run(Main.class, args);}@Overridepublic void run(String... args) throws Exception {foo.foo();person.foo();}}

Foo.foo() invoked!
Person.foo() invoked!

spring注册bean相关推荐

  1. Spring注册Bean(提供Bean)系列--方法大全

    原文网址:Spring注册Bean(提供Bean)系列--方法大全_IT利刃出鞘的博客-CSDN博客 简介 本文用示例介绍SpringBoot如何向容器注册bean(即:将对象加入容器). 我总结了如 ...

  2. spring注册Bean的几种方式

    对于任何框架来说,实现一功能,主要分为两种方式: 声明式 代码式 在spring中通过声明式来创建Bean的方法主要有: xml文件 @Component.@Service.@Controller等 ...

  3. spring初识--bean的几种注册方式

    spring彻底改变了java世界观.spring解决了java 对象管理问题,今天我们来看看spring创建对象的方式有哪些至今还不知道的吧 注册bean的几种方式(IOC) BeanDefinit ...

  4. 四、Spring中使用@Conditional按照条件注册Bean

    以前其实是写过@Condtional注解的笔记的,这里附上链接: Spring中的@conditional注解 但已经忘记的差不多了,所以今天再重新学习下,可以互补着学习 @Contional:按照一 ...

  5. Spring之动态注册bean

    Spring之动态注册bean 什么场景下,需要主动向Spring容器注册bean呢? 如我之前做个的一个支持扫表的基础平台,使用者只需要添加基础配置 + Groovy任务,就可以丢到这个平台上面来运 ...

  6. Spring Core Container 源码分析七:注册 Bean Definitions

    前言 原本以为,Spring 通过解析 bean 的配置,生成并注册 bean defintions 的过程不太复杂,比较简单,不用单独开辟一篇博文来讲述:但是当在分析前面两个章节有关 @Autowi ...

  7. 【栖梧-源码-spring】@Bean从解析到注册到beanDefinitionMap

    [栖梧-源码-spring]@Bean从解析到注册到beanDefinitionMap 序幕 源码阅读技巧 本文说明 类 ConfigurationClassParser#doProcessConfi ...

  8. 【Spring】Bean注册和注入

    上接[Spring]spring核心思想--IOC和DI 上篇文章结尾简单介绍了一下使用 XML 注册 Bean,这篇文章接着介绍一下 XML 注册 Bean 和使用注解注册.注入 Bean 文章目录 ...

  9. Spring注解驱动开发第10讲——在@Import注解中使用ImportBeanDefinitionRegistrar向容器中注册bean

    写在前面 在前面的文章中,我们学习了如何使用@Import注解向Spring容器中导入bean,不仅可以使用@Import注解快速向容器中导入bean,也可以在@Import注解中使用ImportSe ...

最新文章

  1. JS进阶篇--ckplayer.js视频播放插件
  2. Unobtrusive JavaScript 不唐突的JavaScript的七条准则
  3. java中的main的介绍_Java中的main函数详细讲解
  4. 查看SQL SERVER数据库的连接数
  5. 牛客挑战赛53G-同源数组(Easy Version)【NTT】
  6. Shell编程之多命令顺序执行和管道符
  7. VS 提示:请考虑使用 app.config 将程序集“XXX”从版本“XX”重新映射到版本“XX”,以解决冲突并消除警告。...
  8. Python Django 之 jQuery
  9. 算法工程师书籍推荐——典藏版
  10. 简单几步开启Mac访问NTFS格式读写
  11. 关于打印机驱动无法装载的问题
  12. 介绍打印机脱机的四种恢复方法
  13. php格林威治时间,PHP默认时间是格林威治时间。
  14. 今日头条面试——iOS开发岗
  15. 如何优雅的整合定时批量任务(荣耀典藏版)
  16. 如何利用imagick合并2张图后为动态效果
  17. UFC/k1 VS中国散打!!!!!!!
  18. 为什么SHL和SAL相同
  19. 计算机桌面空白地方鼠标右击没有属性选项,Win7系统右键计算机属性不见了怎么办...
  20. 双系统中从Windows访问Linux分区 ext2 ext3 的三种方法

热门文章

  1. 浅谈Rem 及其转换原理
  2. 计算机图形学几何变换
  3. 为什么有人说开车时,最能看出一个人的情商和潜力?
  4. 感觉养老金越涨差距越大,有人提议高于5000的不再上涨,合理吗?
  5. 海员可以饮用蒸馏海水吗?
  6. 是谁开发出手机曲面屏这种
  7. 现在五年期定期利率在五以上的银行有哪些?
  8. 银行存款都有哪些误区,你都有踩坑吗?
  9. 因为我们一直强调选品的重要性
  10. 赚钱真的要抓住风口,抓住风口猪都能飞