实习成长之路——Spring Bean 二:如何注册BeanDefinition?
注册Spring Bean
BeanDefinition 注册
- XML 配置元信息
- <bean name=”…” … />
- Java 注解配置元信息
- @Bean
@Component
@Import
- @Bean
- Java API 配置元信息
- 命名方式:BeanDefinitionRegistry#registerBeanDefinition(String,BeanDefinition)
- 非命名方式:BeanDefinitionReaderUtils#registerWithGeneratedName(AbstractBeanDefinition,BeanDe
finitionRegistry) - 配置类方式:AnnotatedBeanDefinitionReader#register(Class…)
注解方式配置
例子
/*** @ClassName AnnotationBeandefinitionDemo* @Description* @Author huacheng* @Date 2021/9/21 5:33 下午* @Version 1.0**/
//3。通过Import来导入
@Import(AnnotationBeandefinitionDemo.Config.class)
public class AnnotationBeandefinitionDemo {public static void main(String[] args) {//创建BeanFactory容器AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();//注册Configuration Class 配置类
// applicationContext.register(Config.class);applicationContext.register(AnnotationBeandefinitionDemo.class);//启动上下文applicationContext.refresh();//1.通过@Bean方式定义//2.通过@Component方式//这里会不会有冲突呢?都是重复性的导入//依赖查找Map<String, Config> configBeans = applicationContext.getBeansOfType(Config.class);System.out.println("Config Beans 的所有实例" + configBeans);System.out.println("User类型 的所有实例" + applicationContext.getBeansOfType(User.class));applicationContext.close();;}@Component //定义当前类走位哦Spring Bean 组件public static class Config{@Bean(name={"user","xiaowang-user"})public User user(){User user = new User();user.setAge(18);user.setName("小王");return user;}}}
运行结果
Config Beans 的所有实例{com.huacheng.spring.bean.definition.AnnotationBeandefinitionDemo$Config=com.huacheng.spring.bean.definition.AnnotationBeandefinitionDemo$Config@58c1670b}
User类型 的所有实例{user=User{name='小王', age=18}}
发现Spring并不会重复注册的
通过JavaAPI注册
部分代码实现
/*** @ClassName AnnotationBeandefinitionDemo* @Description* @Author huacheng* @Date 2021/9/21 5:33 下午* @Version 1.0**/
//3。通过Import来导入
@Import(AnnotationBeandefinitionDemo.Config.class)
public class AnnotationBeandefinitionDemo {public static void main(String[] args) {//创建BeanFactory容器AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();//注册Configuration Class 配置类
// applicationContext.register(Config.class);applicationContext.register(AnnotationBeandefinitionDemo.class);//启动上下文applicationContext.refresh();//通过BeanDefinition注册API实现//1。命名Bean的注册方式registerUserBeanDefinition(applicationContext,"hua-user");//2.非命名方式registerUserBeanDefinition(applicationContext);//1.通过@Bean方式定义//2.通过@Component方式//这里会不会有冲突呢?都是重复性的导入//依赖查找Map<String, Config> configBeans = applicationContext.getBeansOfType(Config.class);System.out.println("Config Beans 的所有实例" + configBeans);System.out.println("User类型 的所有实例" + applicationContext.getBeansOfType(User.class));applicationContext.close();;}/*** 命名Bean的注册方式* @param registry* @param beanName*/public static void registerUserBeanDefinition(BeanDefinitionRegistry registry,String beanName){BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(User.class);beanDefinitionBuilder.addPropertyValue("name","小王").addPropertyValue("age",18);//判断如果beanName参数存在时if(StringUtils.hasText(beanName)){//注册BeanDefintionregistry.registerBeanDefinition(beanName,beanDefinitionBuilder.getBeanDefinition());}else{//非命名方式BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinitionBuilder.getBeanDefinition(),registry);}}public static void registerUserBeanDefinition(BeanDefinitionRegistry registr){registerUserBeanDefinition(registr,null);}@Component //定义当前类走位哦Spring Bean 组件public static class Config{@Bean(name={"user","xiaowang-user"})public User user(){User user = new User();user.setAge(18);user.setName("小王");return user;}}}
运行结果
Config Beans 的所有实例{com.huacheng.spring.bean.definition.AnnotationBeandefinitionDemo$Config=com.huacheng.spring.bean.definition.AnnotationBeandefinitionDemo$Config@23d2a7e8}
User类型 的所有实例{user=User{name='小王', age=18}, hua-user=User{name='小王', age=18}, com.huacheng.ioc.dependency.lookup.domain.User#0=User{name='小王', age=18}}
我们可以看到,User已经有3个对象了,为什么别名没有出现?
别名并不是真正的Bean,所以只会出现3个
一个是user,一个是命名的user:hua-user,一个是非命名方式,也就是xxx#0的那个
实习成长之路——Spring Bean 二:如何注册BeanDefinition?相关推荐
- C与C++成长之路——c提高二之指针强化和字符串
数据类型 数据类型的本质:固定内存大小的别名 数据类型的作用:编译器预算对象(变量)分配的内存空间大小.int a; 告诉编译器分配四个字节的内存 数据类型可以通过typedef起别名 可以通过siz ...
- Spring:Spring IOC注解方式注册beanDefinition
文章目录 1.美图 2.概述 3.案例 3.1 案例1 4.容器初始化 5.AnnotationConfigApplicationContext 5.1 registerBean 5.1.1 clas ...
- Spring Bean 是什么?
本文内容如有错误.不足之处,欢迎技术爱好者们一同探讨,在本文下面讨论区留言,感谢. 文章目录 简述 Spring Bean 基础 定义Spring Bean BeanDefinition 元信息 命名 ...
- Spring(二)--------Spring配置、DI依赖注入、Bean自动装配
Spring(二)--------Spring配置.DI依赖注入.Bean自动装配 5.Spring配置 5.1 别名 设置别名:第一种方式alias <!--其中name为ID的对应值--&g ...
- 电系魔法师成长之路—仪器仪表学习(二)设计T型和Π型衰减器
电系魔法师成长之路-仪器仪表学习(二)设计T型和Π型衰减器 一.用途 衰减器是一种提供衰减的电子元器件, 广泛地应用于电子设备中,它的主要用途是:(1)调整电路中信号的大小:(2)在比较法测量电路 ...
- 菜鸟程序员的成长之路(二)——时间都去哪儿了
距离我的上篇博客菜鸟程序员的成长之路(一)已经过去六个月的时间,又到了总结收获的季节.在漫长的六个月里,发生的了很多的事.残存在大脑中的记忆(不是脑残),已经不能将我带回到去年的九月份,想问自己一句: ...
- Spring点滴二:Spring Bean
Spring Bean: 被称作bean的对象是构成应用程序的支柱,是由Spring Ioc容器管理.bean是一个被实例化,配置.组装并由Spring Ioc容器管理对象. 官网API:A Spri ...
- CISSP的成长之路(二十一):用户持有凭证
在51CTO安全频道特别策划的CISSP的成长之路系列的上一篇文章<讲解身份验证过程>里,J0ker给大家介绍了用户验证时所依赖的三种验证要素.密码和密码短语及其安全使用原则.作为技术实施 ...
- Spring Bean的生命周期(二)
上一篇文章大致说明了Spring Bean的生命周期,本章详细说明各个阶段调用的接口方法. 1.1 - 3.2 对应 实例化 Instantiation 4.1 - 4.2 对应 属性赋值 Popul ...
- 刘知远、赵鑫、施柏鑫:AI青年科研人员成长之路
整理 | 刘冰一 在6月2日举办的智源大会青源学术年会举办的一个圆桌"青年科研人员成长之路与经验分享"上,清华大学计算机系副教授刘知远.中国人民大学高瓴人工智能学院长聘副教授赵鑫. ...
最新文章
- UML部署图(转载)
- ACMNO.13求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字。 输入 n 输出 和 样例输入 5 样例输出 153
- ssh vim中不小心按下ctrl+s
- [译]GPU加持,TensorFlow Lite更快了
- mysql维护计划任务_浅谈MySQL event 计划任务
- spring 处理带有特殊字符的请求_程序员笔记|常见的Spring异常分析及处理
- 滑动验证码研究-后续
- 统计学作业4 概念
- 交换机生成树相关实验
- PPT插入形状,在里面填写文字,文本框过大
- python怎么算列表的平方_Python中排序形式的元素的平方列表
- 字幕集合保存为srt文件
- 2019.03.04【ZJOI2018】【BZOJ5212】【洛谷P4338】历史(假LCT)
- 一起学习R语言吧——R语言+RStudio
- js库笔记(一):swr ahooks
- 使用pgpool-ii 搭建postgresql 高可用、负载均衡架构
- Linux以太网卡软硬件架构
- dataframe建一个空的,pySpark创建空DataFrame
- 再见 Docker,是时候拥抱下一代容器工具 Containerd 了!
- 2018计算机专业研究院教育部评估
热门文章
- 主成分分析法怎么提取图片中的字_视频图像的MATLAB处理(2)两种主成分分析方法...
- qpython 使用教程_python中spy++的使用超详细教程
- 锦城学院计算机系考研,奋斗的青春, 滚烫的人生—— —我的考研路
- cudnn 7.5 linux x64,Ubuntu 18.04 N卡驱动安装+CUDA10.0+cuDNN7.5+Anaconda+Tensorflow-GPU
- 树形动态规划 java_树形动态规划
- foreach进不去报错java_为什么阿里巴巴Java开发手册中强制要求不要在foreach循环里进行元素的remove和add操作...
- java 引用类型 String_java基础之 数据类型 值传递 引用传递 String 四种引用类型...
- 吴恩达教授机器学习课程笔记【七】- Part 7 最优模型选择
- 关于图神经网络的相关学习资源的分享——网站 博客(一)
- 三维重建-立体校正(Recitification)