注册Spring Bean

BeanDefinition 注册

  • XML 配置元信息

    • <bean name=”…” … />
  • Java 注解配置元信息
    • @Bean
      @Component
      @Import
  • 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?相关推荐

  1. C与C++成长之路——c提高二之指针强化和字符串

    数据类型 数据类型的本质:固定内存大小的别名 数据类型的作用:编译器预算对象(变量)分配的内存空间大小.int a; 告诉编译器分配四个字节的内存 数据类型可以通过typedef起别名 可以通过siz ...

  2. Spring:Spring IOC注解方式注册beanDefinition

    文章目录 1.美图 2.概述 3.案例 3.1 案例1 4.容器初始化 5.AnnotationConfigApplicationContext 5.1 registerBean 5.1.1 clas ...

  3. Spring Bean 是什么?

    本文内容如有错误.不足之处,欢迎技术爱好者们一同探讨,在本文下面讨论区留言,感谢. 文章目录 简述 Spring Bean 基础 定义Spring Bean BeanDefinition 元信息 命名 ...

  4. Spring(二)--------Spring配置、DI依赖注入、Bean自动装配

    Spring(二)--------Spring配置.DI依赖注入.Bean自动装配 5.Spring配置 5.1 别名 设置别名:第一种方式alias <!--其中name为ID的对应值--&g ...

  5. 电系魔法师成长之路—仪器仪表学习(二)设计T型和Π型衰减器

    电系魔法师成长之路-仪器仪表学习(二)设计T型和Π型衰减器 一.用途 ​ 衰减器是一种提供衰减的电子元器件, 广泛地应用于电子设备中,它的主要用途是:(1)调整电路中信号的大小:(2)在比较法测量电路 ...

  6. 菜鸟程序员的成长之路(二)——时间都去哪儿了

    距离我的上篇博客菜鸟程序员的成长之路(一)已经过去六个月的时间,又到了总结收获的季节.在漫长的六个月里,发生的了很多的事.残存在大脑中的记忆(不是脑残),已经不能将我带回到去年的九月份,想问自己一句: ...

  7. Spring点滴二:Spring Bean

    Spring Bean: 被称作bean的对象是构成应用程序的支柱,是由Spring Ioc容器管理.bean是一个被实例化,配置.组装并由Spring Ioc容器管理对象. 官网API:A Spri ...

  8. CISSP的成长之路(二十一):用户持有凭证

    在51CTO安全频道特别策划的CISSP的成长之路系列的上一篇文章<讲解身份验证过程>里,J0ker给大家介绍了用户验证时所依赖的三种验证要素.密码和密码短语及其安全使用原则.作为技术实施 ...

  9. Spring Bean的生命周期(二)

    上一篇文章大致说明了Spring Bean的生命周期,本章详细说明各个阶段调用的接口方法. 1.1 - 3.2 对应 实例化 Instantiation 4.1 - 4.2 对应 属性赋值 Popul ...

  10. 刘知远、赵鑫、施柏鑫:AI青年科研人员成长之路

    整理 | 刘冰一 在6月2日举办的智源大会青源学术年会举办的一个圆桌"青年科研人员成长之路与经验分享"上,清华大学计算机系副教授刘知远.中国人民大学高瓴人工智能学院长聘副教授赵鑫. ...

最新文章

  1. UML部署图(转载)
  2. ACMNO.13求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字。 输入 n 输出 和 样例输入 5 样例输出 153
  3. ssh vim中不小心按下ctrl+s
  4. [译]GPU加持,TensorFlow Lite更快了
  5. mysql维护计划任务_浅谈MySQL event 计划任务
  6. spring 处理带有特殊字符的请求_程序员笔记|常见的Spring异常分析及处理
  7. 滑动验证码研究-后续
  8. 统计学作业4 概念
  9. 交换机生成树相关实验
  10. PPT插入形状,在里面填写文字,文本框过大
  11. python怎么算列表的平方_Python中排序形式的元素的平方列表
  12. 字幕集合保存为srt文件
  13. 2019.03.04【ZJOI2018】【BZOJ5212】【洛谷P4338】历史(假LCT)
  14. 一起学习R语言吧——R语言+RStudio
  15. js库笔记(一):swr ahooks
  16. 使用pgpool-ii 搭建postgresql 高可用、负载均衡架构
  17. Linux以太网卡软硬件架构
  18. dataframe建一个空的,pySpark创建空DataFrame
  19. 再见 Docker,是时候拥抱下一代容器工具 Containerd 了!
  20. 2018计算机专业研究院教育部评估

热门文章

  1. 主成分分析法怎么提取图片中的字_视频图像的MATLAB处理(2)两种主成分分析方法...
  2. qpython 使用教程_python中spy++的使用超详细教程
  3. 锦城学院计算机系考研,奋斗的青春, 滚烫的人生—— —我的考研路
  4. cudnn 7.5 linux x64,Ubuntu 18.04 N卡驱动安装+CUDA10.0+cuDNN7.5+Anaconda+Tensorflow-GPU
  5. 树形动态规划 java_树形动态规划
  6. foreach进不去报错java_为什么阿里巴巴Java开发手册中强制要求不要在foreach循环里进行元素的remove和add操作...
  7. java 引用类型 String_java基础之 数据类型 值传递 引用传递 String 四种引用类型...
  8. 吴恩达教授机器学习课程笔记【七】- Part 7 最优模型选择
  9. 关于图神经网络的相关学习资源的分享——网站 博客(一)
  10. 三维重建-立体校正(Recitification)