文章目录

  • 一、方式一
  • 二、方式二
  • 三、方式三
  • 四、总结

在Spring源码中,Spring会先将类扫描为一个一个的BeanDefinition,用于存放Bean的一些基本信息,简称为Bean的定义信息。后续生成完整Bean时,直接从该集合中获取。

该集合在DefaultListableBeanFactory类中,是一个十分重要的类。

前期准备:

实体类

//在使用前两种方式时不需要添加注解,使用包扫描时需要添加注解
//@Component
public class MoBian {}

一、方式一

等价于@Bean

public class test02 {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();AnnotatedBeanDefinitionReader annotatedBeanDefinitionReader = new AnnotatedBeanDefinitionReader(context);annotatedBeanDefinitionReader.register(MoBian.class);System.out.println(context.getBean("moBian"));}
}

三步:

  1. 初始化Spring容器
  2. 通过容器创建注解型的BD读取器
  3. 将我们的Bean直接注册到读取器中

二、方式二

等价于传统的ClassPathXmlApplicationContext传入配置文件

public class test02 {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(context);// 返回注册的Bean数量int i = xmlBeanDefinitionReader.loadBeanDefinitions("spring-test.xml");System.out.println(context.getBean("moBian"));}
}

步骤三步:

  1. 初始化Spring容器
  2. 通过配置文件创建XML类型的BD读取器,
  3. 完成将配置文件中的Bean加载到BD读取器中

三、方式三

等价于@ComponentScan+@Component的组合

public class test02 {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(context);scanner.scan("pers.mobian.springfirst.factorybean");System.out.println(context.getBean("moBian"));}
}

步骤三步:

  1. 初始化Spring容器
  2. 通过容器创建扫描型的BD读取器
  3. 配置对应的扫描路径
  4. 对被目标实体添加对应的注解

四、总结

以上三种方式,可以分别对应我们将Bean添加到Spring容器中的不同方式。直接将实体类注册为Bean;通过xml配置文件注册为Bean;配置扫描路径注册Bean。

不难发现,我们在初始化Spring容器时并没有指定对应的配置文件(xml方式除外)。以前我们配置Spring容器都是添加一个AppConfig.java的配置文件,然后通过@ComponentScan与@Component的方式去扫描Bean,或者是通过@Bean的方式去注册Bean。以上的方式就可以理解为两种方式的编程式写法。当然目的都是相同的,只是写法不同。

明白BeanDefinition的含义、来源、用途,对应理解Spring源码起着至关重要的作用。

通过BeanDefinitionReader获取BeanDefinition的三种不同方式相关推荐

  1. SpringBoot静态获取 bean的三种方式,你学会了吗?

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/showchi/article/details/97005720 注意:调用者要被spring管理 ...

  2. java 不知道类名_Java 中获取类名的三种方法,你知道几种?

    之前我们分享过Java高级篇--深入浅出Java类加载机制这篇文章,今天来带你了解获取类名的三种方法. 获取类名的方法 Java 中获取类名的方式主要有以下三种. getName() 返回的是虚拟机里 ...

  3. android获取自定义属性,android 自定义控件中获取属性的三种方式(转)

    第一种方法,直接设置属性值,通过attrs.getAttributeResourceValue拿到这个属性值. (1)在xml文件中设置属性值 android:layout_width="f ...

  4. java 反射 找不到方法_Java获取反射的三种方法

    class Student { private int id; String name; protected boolean sex ; pub1ic f1oat score; } pub1ic cl ...

  5. Spring Boot当中获取request的三种方式

    本篇博客主要记录request相关知识,也是开发当中经常遇到的,感兴趣的跟小编一起学习吧! 目录 一.请求过程 二.获取request的三种方式 2.1.可以封装为静态方法 2.2.controlle ...

  6. react的ref三种使用方式,获取元素内容

    react的ref三种使用方式,获取元素内容. 注意:应尽可能少的使用ref,优先使用state 1.字符串 refGetData1=()=>{alert("获取到的内容:" ...

  7. UG\NX二次开发 获取相切面的三种方法

    文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: UG\NX二次开发 获取相切面的三种方法 方法1: 使用NX Open C++ 的面 ...

  8. android系统通过图片绝对路径获取URI的三种方法

    老马的技术博客 android系统通过图片绝对路径获取URI的三种方法 最近做项目要通过图片的绝对路径找到图片的URI,然后删除图片,小小总结一下获取URI的方法,亲自试验在 android 4.1. ...

  9. java时间戳是什么类型_java 获取时间戳的三种方式

    java 获取时间戳的三种方式 CreationTime--2018年7月13日16点29分 Author:Marydon 1.实现方式 方式一:推荐使用 System.currentTimeMill ...

  10. php获取另一个网页内容,php获取网页内容的三种方法

    本文介绍下,php实现获取网页内容的三种方法,有需要的朋友,参考下吧. 用php代码实现获取网页的原理: 将抓取内容,通过正则表达式过滤,得到想要的内容. 关于正则表达式的内容,程序员之家介绍了很多, ...

最新文章

  1. pandas重置dataframe的索引(reset_index)、如果索引不匹配dataframe操作时候的问题、重置索引(不设置drop=true)远索引生成新的数据列
  2. javascript Windows对象(BOM)
  3. python从零开始系列连载_技术 | Python从零开始系列连载(一)
  4. 深度学习之keras (一) 初探
  5. JAVA基础知识之字节和字符
  6. Python外(5)-for-enumerate()-zip()
  7. VC限制只能输入常规数字的CEdit控件
  8. (组合数学笔记)Pólya计数理论_Part.10_Pólya定理的推广——De Bruijn定理的母函数形式
  9. 基于 .Net5.0 的快速开发框架,YuebonCore1.0.3 版已发布
  10. Android Material文本字段
  11. 【Python】python帮助文档
  12. css loader.net,css-loader style-loader原理探究
  13. 视频教程-网络工程师实战系列视频课程【VLAN专题】-网络技术
  14. 产品需求分析思路和方法
  15. 【C语言】练习3-8 查询水果价格
  16. 继续分享一些基础的Python编程2
  17. mysql数据库语言_mysql数据库sql语句基础知识
  18. Testbench编写指南(2)文件的读写操作
  19. 【Web UI自动化测试】Web UI自动化测试之日志收集篇(全网最全)
  20. Gitlab的branch与Tag的使用

热门文章

  1. nodejs后台系列--第四篇--koa
  2. 网络基础知识(黑马教程笔记)-4-http请求与响应的处理
  3. git学习笔记-(7-高层命令(1))
  4. java 求集合真子集_干货 | 集合与函数概念知识点总结
  5. python如何选择两种不同输入方式_从Python到空间分析arcpy || 第一回:关于连载的总介绍...
  6. 求一个任意实数的算术平方根的算法设计_感恩!面试必刷100道算法题
  7. antd vue 的table添加背景颜色_「教程」Spire.PDF教程:如何给PDF添加背景颜色和平铺背景图...
  8. laravel mysql增删改查_laravel基础laravle中orm简单的增删改查-一颗优雅草男神你姚哥...
  9. python函数进阶小结_Python 函数3000字使用总结
  10. 天津盈克斯机器人科技_坐标天津,适合亲子游的科技馆,亮点是机器人展区