spring注册bean
手动注册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相关推荐
- Spring注册Bean(提供Bean)系列--方法大全
原文网址:Spring注册Bean(提供Bean)系列--方法大全_IT利刃出鞘的博客-CSDN博客 简介 本文用示例介绍SpringBoot如何向容器注册bean(即:将对象加入容器). 我总结了如 ...
- spring注册Bean的几种方式
对于任何框架来说,实现一功能,主要分为两种方式: 声明式 代码式 在spring中通过声明式来创建Bean的方法主要有: xml文件 @Component.@Service.@Controller等 ...
- spring初识--bean的几种注册方式
spring彻底改变了java世界观.spring解决了java 对象管理问题,今天我们来看看spring创建对象的方式有哪些至今还不知道的吧 注册bean的几种方式(IOC) BeanDefinit ...
- 四、Spring中使用@Conditional按照条件注册Bean
以前其实是写过@Condtional注解的笔记的,这里附上链接: Spring中的@conditional注解 但已经忘记的差不多了,所以今天再重新学习下,可以互补着学习 @Contional:按照一 ...
- Spring之动态注册bean
Spring之动态注册bean 什么场景下,需要主动向Spring容器注册bean呢? 如我之前做个的一个支持扫表的基础平台,使用者只需要添加基础配置 + Groovy任务,就可以丢到这个平台上面来运 ...
- Spring Core Container 源码分析七:注册 Bean Definitions
前言 原本以为,Spring 通过解析 bean 的配置,生成并注册 bean defintions 的过程不太复杂,比较简单,不用单独开辟一篇博文来讲述:但是当在分析前面两个章节有关 @Autowi ...
- 【栖梧-源码-spring】@Bean从解析到注册到beanDefinitionMap
[栖梧-源码-spring]@Bean从解析到注册到beanDefinitionMap 序幕 源码阅读技巧 本文说明 类 ConfigurationClassParser#doProcessConfi ...
- 【Spring】Bean注册和注入
上接[Spring]spring核心思想--IOC和DI 上篇文章结尾简单介绍了一下使用 XML 注册 Bean,这篇文章接着介绍一下 XML 注册 Bean 和使用注解注册.注入 Bean 文章目录 ...
- Spring注解驱动开发第10讲——在@Import注解中使用ImportBeanDefinitionRegistrar向容器中注册bean
写在前面 在前面的文章中,我们学习了如何使用@Import注解向Spring容器中导入bean,不仅可以使用@Import注解快速向容器中导入bean,也可以在@Import注解中使用ImportSe ...
最新文章
- JS进阶篇--ckplayer.js视频播放插件
- Unobtrusive JavaScript 不唐突的JavaScript的七条准则
- java中的main的介绍_Java中的main函数详细讲解
- 查看SQL SERVER数据库的连接数
- 牛客挑战赛53G-同源数组(Easy Version)【NTT】
- Shell编程之多命令顺序执行和管道符
- VS 提示:请考虑使用 app.config 将程序集“XXX”从版本“XX”重新映射到版本“XX”,以解决冲突并消除警告。...
- Python Django 之 jQuery
- 算法工程师书籍推荐——典藏版
- 简单几步开启Mac访问NTFS格式读写
- 关于打印机驱动无法装载的问题
- 介绍打印机脱机的四种恢复方法
- php格林威治时间,PHP默认时间是格林威治时间。
- 今日头条面试——iOS开发岗
- 如何优雅的整合定时批量任务(荣耀典藏版)
- 如何利用imagick合并2张图后为动态效果
- UFC/k1 VS中国散打!!!!!!!
- 为什么SHL和SAL相同
- 计算机桌面空白地方鼠标右击没有属性选项,Win7系统右键计算机属性不见了怎么办...
- 双系统中从Windows访问Linux分区 ext2 ext3 的三种方法