功能作用

BeanDefinition 是定义 Bean 的配置元信息接口,包含:

Bean 的类名
设置父 bean 名称、是否为 primary、
Bean 行为配置信息,作用域、自动绑定模式、生命周期回调、延迟加载、初始方法、销毁方法等
Bean 之间的依赖设置,dependencies
构造参数、属性设置

BeanDefinition 子类方法更为丰富些。
派生出 AnnotatedBeanDefinition 接口,以及常用子类 RootBeanDefinition、GenericBeanDefinition。
可以使用 BeanDefinitionBuilder 或 new BeanDefinition 实现类构建 BeanDefinition 对象。

为什么这样设计?

假设没有BeanDefinition

假设没有 没有BeanDefinition 这一层的存在,Spring 实例化Bean的模型是这样的,

这个时候,由于版本更迭,xml配置的形式 被弃用,需要使用 注解的方式注解Bean,由于解析工作与实例化的代码 冗杂在一起, xml那一套完全 不被使用, 需要重新写一套 边解析注解,边实例化的 逻辑。由于设计的缺陷,导致了开发的工作量提升, 且代码复用性 也不高。

有BeanDefinition

现在 存在BeanDefinition,Spring 解析xml文件,实例化Bean的模型是这样的,

此时需要增加 扫描注解 实例化Bean的逻辑,那么就只有 解析的工作不一样,后面的实例化部分的逻辑可以共用。 而解析 其实只是 ioc 很小的一部分而已。实现了 解析配置和 实例化的耦合,增加了代码的复用性,可维护性, 可拓展性。

如果 再需要加一种 注册Bean的方式, 比如文件,网络,那么只要 拓展 对应的解析阶段的逻辑 , 保持 实例化Bean的逻辑不变。

BeanDefinition 属性介绍

示例

User.java

package constxiong;public class User {private Integer id;private String name;public User() {}public User(Integer id, String name) {this.id = id;this.name = name;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "User [id=" + id + ", name=" + name + "]";}}

构建和注册 BeanDefinition 对象测试类

package constxiong;import org.springframework.beans.factory.config.ConstructorArgumentValues;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.support.RootBeanDefinition;/*** 测试 BeanDefinition 构建* @author ConstXiong*/
public class Test {public static void main(String[] args) {DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();// BeanDefinitionBuilder 构建 BeanDefinitionBeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(User.class).addPropertyValue("id", 1) //属性设置.addPropertyValue("name", "constxiong");beanFactory.registerBeanDefinition("user1", builder.getBeanDefinition());User user = beanFactory.getBean("user1", User.class);System.out.println(user);//直接 new 的方式,创建 BeanDefinitionBuilder 对象RootBeanDefinition beanDefinition = new RootBeanDefinition(User.class);//构造参数ConstructorArgumentValues constructorArgumentValues = new ConstructorArgumentValues();constructorArgumentValues.addIndexedArgumentValue(0, 1);constructorArgumentValues.addIndexedArgumentValue(1, "user2");beanDefinition.setConstructorArgumentValues(constructorArgumentValues);beanFactory.registerBeanDefinition("user2", beanDefinition);User user2 = beanFactory.getBean("user2", User.class);System.out.println(user2);}}

什么是BeanDefination相关推荐

  1. Spring:BeanDefination (上)

    前言: 关于 BeanDefination 在Spring 官方文档中介绍:官方文档,第1.3条: 摘抄: 文档翻译如下: SpringIoc容器管理一个Bean或多个Bean,这些Bean通过我们提 ...

  2. Spring5源码 - 01 BeanDefination源码分析

    文章目录 引入 Bean实例化的原理 singleton vs prototype Singleton VS Prototype 小结 下文 引入 Spring 是如何生成一个Bean的? 我们先看个 ...

  3. Spring BeanDefinitionRegistryPostProcessor BeanPostProcessor作用

    写博客,写博客,把自己知道的小知识点全部记录,? BeanDefinitionRegistryPostProcessor 接口属于Beanddefination  装配定义的范畴,此时bean 并没有 ...

  4. Spring事务配置探究

    2019独角兽企业重金招聘Python工程师标准>>> 一.项目中spring+mybaits xml配置解析 一般我们会在datasource.xml中进行如下配置,但是其中每个配 ...

  5. 面试官:讲讲Spring框架Bean的加载过程

    spring作为目前我们开发的基础框架,每天的开发工作基本和他形影不离,作为管理bean的最经典.优秀的框架,它的复杂程度往往令人望而却步. 不过作为朝夕相处的框架,我们必须得明白一个问题就是spri ...

  6. Spring - Java/J2EE Application Framework 应用框架 第 3 章 Beans, BeanFactory和ApplicationContext

    第 3 章 Beans, BeanFactory和ApplicationContext 3.1. 简介 在Spring中,两个最基本最重要的包是 org.springframework.beans 和 ...

  7. MyBatis关键配置-接口注入使用

    我们使用Mapper 的时候,只需要在加了Service 注解的类里面使用@Autowired注入Mapper 接口就好了. @Service public class EmployeeService ...

  8. MyBatis关键配置-创建会话工厂

    Spring 对MyBatis 的对象进行了管理,但是并不会替换MyBatis 的核心对象.也就意味着:MyBatis jar 包中的SqlSessionFactory.SqlSession.Mapp ...

  9. MyBatis(五)MyBatis整合Spring原理分析

    前面梳理了下MyBatis在单独使用时的工作流程和关键源码,现在看看MyBatis在和Spring整合的时候是怎么工作的 也先从使用开始 Spring整合MyBatis 1.引入依赖,除了MyBati ...

最新文章

  1. php mysql操作封装_php封装MySQL数据库基本操作
  2. token验证_java基于token的身份验证?读完之后,大部分程序员收藏了...
  3. Linux上创建一个用户,并给该用户指定目录的权限,修改时区
  4. 14、ORACLE下的基本SQL操作
  5. 高段位产品经理必须掌握的商业模式分析该怎么做?
  6. 智慧讲台:office 文件 pdf 文件 转成 png图片
  7. yolov3为什么对大目标检测不好_【目标检测简史】进击的YOLOv3,目标检测网络的巅峰之作...
  8. Leetcode 105. 前序和中序遍历序列构造二叉树
  9. 第23章 排序算法(包括merge等)
  10. cluster(3)
  11. fht算法c语言源码,sklearn中LinearRegression使用及源码解读
  12. 怎么用python画sin函数图像_用python画三角函数
  13. ensp 下一跳选址
  14. uwsgi 的启动、停止、重启
  15. Redis缓存读写策略
  16. python跟plc通信
  17. 华为cor—al10_华为荣耀cor_al10是 什么型号的手机
  18. 1、背景属性 背景颜色绘制区域——background-clip属性
  19. 浅析轻量化网络mobilenet
  20. matlab演示平抛运动,几何画板动态演示平抛运动的规律

热门文章

  1. Linux文件系统概览
  2. windows桌面便笺使用小技巧
  3. u盘在本机电脑读不出来,但别的机器可以读解决方案
  4. 两个ListMap中同下标的map去重合并
  5. SQL学习-2.7 SQL聚合
  6. 【方案PCBA设计】LCD显示的蓝牙厨房电子秤方案
  7. macOS Ventura 13.0 (22A380) Boot ISO 原版可引导镜像
  8. FP-growth:FP树的构建
  9. 头寸是什么意思之如何建立自己的头寸?
  10. pytorch简单实现yolo v1