通过BeanDefinitionReader获取BeanDefinition的三种不同方式
文章目录
- 一、方式一
- 二、方式二
- 三、方式三
- 四、总结
在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"));}
}
三步:
- 初始化Spring容器
- 通过容器创建注解型的BD读取器
- 将我们的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"));}
}
步骤三步:
- 初始化Spring容器
- 通过配置文件创建XML类型的BD读取器,
- 完成将配置文件中的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"));}
}
步骤三步:
- 初始化Spring容器
- 通过容器创建扫描型的BD读取器
- 配置对应的扫描路径
- 对被目标实体添加对应的注解
四、总结
以上三种方式,可以分别对应我们将Bean添加到Spring容器中的不同方式。直接将实体类注册为Bean;通过xml配置文件注册为Bean;配置扫描路径注册Bean。
不难发现,我们在初始化Spring容器时并没有指定对应的配置文件(xml方式除外)。以前我们配置Spring容器都是添加一个AppConfig.java的配置文件,然后通过@ComponentScan与@Component的方式去扫描Bean,或者是通过@Bean的方式去注册Bean。以上的方式就可以理解为两种方式的编程式写法。当然目的都是相同的,只是写法不同。
明白BeanDefinition的含义、来源、用途,对应理解Spring源码起着至关重要的作用。
通过BeanDefinitionReader获取BeanDefinition的三种不同方式相关推荐
- SpringBoot静态获取 bean的三种方式,你学会了吗?
欢迎关注方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/showchi/article/details/97005720 注意:调用者要被spring管理 ...
- java 不知道类名_Java 中获取类名的三种方法,你知道几种?
之前我们分享过Java高级篇--深入浅出Java类加载机制这篇文章,今天来带你了解获取类名的三种方法. 获取类名的方法 Java 中获取类名的方式主要有以下三种. getName() 返回的是虚拟机里 ...
- android获取自定义属性,android 自定义控件中获取属性的三种方式(转)
第一种方法,直接设置属性值,通过attrs.getAttributeResourceValue拿到这个属性值. (1)在xml文件中设置属性值 android:layout_width="f ...
- java 反射 找不到方法_Java获取反射的三种方法
class Student { private int id; String name; protected boolean sex ; pub1ic f1oat score; } pub1ic cl ...
- Spring Boot当中获取request的三种方式
本篇博客主要记录request相关知识,也是开发当中经常遇到的,感兴趣的跟小编一起学习吧! 目录 一.请求过程 二.获取request的三种方式 2.1.可以封装为静态方法 2.2.controlle ...
- react的ref三种使用方式,获取元素内容
react的ref三种使用方式,获取元素内容. 注意:应尽可能少的使用ref,优先使用state 1.字符串 refGetData1=()=>{alert("获取到的内容:" ...
- UG\NX二次开发 获取相切面的三种方法
文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: UG\NX二次开发 获取相切面的三种方法 方法1: 使用NX Open C++ 的面 ...
- android系统通过图片绝对路径获取URI的三种方法
老马的技术博客 android系统通过图片绝对路径获取URI的三种方法 最近做项目要通过图片的绝对路径找到图片的URI,然后删除图片,小小总结一下获取URI的方法,亲自试验在 android 4.1. ...
- java时间戳是什么类型_java 获取时间戳的三种方式
java 获取时间戳的三种方式 CreationTime--2018年7月13日16点29分 Author:Marydon 1.实现方式 方式一:推荐使用 System.currentTimeMill ...
- php获取另一个网页内容,php获取网页内容的三种方法
本文介绍下,php实现获取网页内容的三种方法,有需要的朋友,参考下吧. 用php代码实现获取网页的原理: 将抓取内容,通过正则表达式过滤,得到想要的内容. 关于正则表达式的内容,程序员之家介绍了很多, ...
最新文章
- pandas重置dataframe的索引(reset_index)、如果索引不匹配dataframe操作时候的问题、重置索引(不设置drop=true)远索引生成新的数据列
- javascript Windows对象(BOM)
- python从零开始系列连载_技术 | Python从零开始系列连载(一)
- 深度学习之keras (一) 初探
- JAVA基础知识之字节和字符
- Python外(5)-for-enumerate()-zip()
- VC限制只能输入常规数字的CEdit控件
- (组合数学笔记)Pólya计数理论_Part.10_Pólya定理的推广——De Bruijn定理的母函数形式
- 基于 .Net5.0 的快速开发框架,YuebonCore1.0.3 版已发布
- Android Material文本字段
- 【Python】python帮助文档
- css loader.net,css-loader style-loader原理探究
- 视频教程-网络工程师实战系列视频课程【VLAN专题】-网络技术
- 产品需求分析思路和方法
- 【C语言】练习3-8 查询水果价格
- 继续分享一些基础的Python编程2
- mysql数据库语言_mysql数据库sql语句基础知识
- Testbench编写指南(2)文件的读写操作
- 【Web UI自动化测试】Web UI自动化测试之日志收集篇(全网最全)
- Gitlab的branch与Tag的使用
热门文章
- nodejs后台系列--第四篇--koa
- 网络基础知识(黑马教程笔记)-4-http请求与响应的处理
- git学习笔记-(7-高层命令(1))
- java 求集合真子集_干货 | 集合与函数概念知识点总结
- python如何选择两种不同输入方式_从Python到空间分析arcpy || 第一回:关于连载的总介绍...
- 求一个任意实数的算术平方根的算法设计_感恩!面试必刷100道算法题
- antd vue 的table添加背景颜色_「教程」Spire.PDF教程:如何给PDF添加背景颜色和平铺背景图...
- laravel mysql增删改查_laravel基础laravle中orm简单的增删改查-一颗优雅草男神你姚哥...
- python函数进阶小结_Python 函数3000字使用总结
- 天津盈克斯机器人科技_坐标天津,适合亲子游的科技馆,亮点是机器人展区