Spring5源码3-BeanDefinition

news2024/11/22 11:20:22

1. BeanDefinition

BeanDefinition在spring中贯穿始终,spring要根据BeanDefinition对象来实例化bean,只有把解析的标签,扫描的注解类封装成BeanDefinition对象,spring才能实例化bean

beanDefinition主要实现类:

  • ChildBeanDefinition
  • GenericBeanDefinition
  • RootBeanDefinition

2. ChildBeanDefinition

ChildBeanDefinition 是一种 BeanDefinition,它可以继承它父类的设置,即 ChildBeanDefinition 对 RootBeanDefinition 有一定的依赖关系。

ChildBeanDefinition 从父类继承构造参数值,属性值并可以重写父类的方法,同时也可以增加新的属性或者方法。(类同于 java 类的继承关系)。若指定初始化方法,销毁方法或者静态工厂方法,ChildBeanDefinition 将重写相应父类的设置。 depends on,autowire mode,dependency check,singleton,lazy init 一般由子类 自行设定。

3. GenericBeanDefinition

从 spring 2.5 开始,提供了一个更好的注册 BeanDefinition 类 GenericBeanDefinition,它支持动态定义父依赖,方法是 GenericBeanDefinition.setParentName(java.lang.String),GenericBeanDefinition 可以有效的替代 ChildBeanDefinition 的绝大分部使用场合。

GenericBeanDefinition 是一站式的标准 BeanDefinition,除了有指定类、可选的构造参数值和属性参数这些其它 BeanDefinition 也有的特性外,它还具有通过 parenetName 属性来灵活设置 parent BeanDefinition。

通常, GenericBeanDefinition 用来注册用户可见的 BeanDefinition(可见的 BeanDefinition 意味着可以在该类 BeanDefinition 上定义 post-processor 来对 bean 进行操作,甚至为配置 parent name 做扩展准备)。RootBeanDefinition / ChildBeanDefinition 用来预定义具有 parent/child 关系的 BeanDefinition。

4. RootBeanDefinition

一个 RootBeanDefinition 定义表明它是一个可合并的 BeanDefinition:即在 spring beanFactory 运行期间,可以返回一个特定的 bean。RootBeanDefinition 可以作为一个重要的通用的 BeanDefinition 视图。

RootBeanDefinition 用来在配置阶段进行注册 BeanDefinition。然后,从 spring 2.5 后,编写注册 BeanDefinition 有了更好的的方法:GenericBeanDefinition。 GenericBeanDefinition 支持动态定义父类依赖,而非硬编码作为 root BeanDefinition。

5. GenericBeanDefinition创建实例

创建实体类UserClass

public class UserClass {

    private String username;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}

创建实现类BeanDefinitionTest,实现BeanDefinitionRegistryPostProcessor接口

@Component
public class BeanDefinitionTest implements BeanDefinitionRegistryPostProcessor {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        GenericBeanDefinition genericBeanDefinition = new GenericBeanDefinition();
        genericBeanDefinition.setBeanClass(UserClass.class);
        MutablePropertyValues propertyValues = genericBeanDefinition.getPropertyValues();
        propertyValues.addPropertyValue("username", "fisher");
        registry.registerBeanDefinition("UserClass", genericBeanDefinition);
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {

    }

}

测试方法

public void test3() {
    ApplicationContext applicationContext = new AnnotationConfigApplicationContext("spring.xml");
    UserClass userClass = (UserClass)applicationContext.getBean("UserClass");
    System.out.println("UserClass-->" + userClass.getUsername());
}

查看打印

6. BeanDefinition中的属性

  • (1)id:Bean的唯一标识名。它必须是合法的XMLID,在整个XML文档中唯一。

  • (2)name:用来为id创建一个或多个别名。它可以是任意的字母符合。多个别名之间用逗号或空格分开

  • (3)class:用来定义类的全限定名(包名+类名)。只有子类Bean不用定义该属性。

  • (4)parent:子类Bean定义它所引用它的父类Bean。这时前面的class属性失效。子类Bean会继承父类Bean的所有属性,子类Bean也可以覆盖父类Bean的属性。注意:子类Bean和父类Bean是同一个Java类。

  • (5)abstract(默认为false):用来定义Bean是否为抽象Bean。它表示这个Bean将不会被实例化,一般用于父类Bean,因为父类Bean主要是供子类Bean继承使用。

  • (6)singleton(默认为true):定义Bean是否是Singleton(单例)。如果设为“true”,则在BeanFactory作用范围内,只维护此Bean的一个实例。如果设为“flase”,Bean将是Prototype(原型)状态,BeanFactory将为每次Bean请求创建一个新的Bean实例。

  • (7)lazy-init(默认为“default”):用来定义这个Bean是否实现懒初始化。如果为“true”,它将在BeanFactory启动时初始化所有的SingletonBean。反之,如果为“false”,它只在Bean请求时才开始创建SingletonBean。

  • (8)autowire(自动装配,默认为“default”):它定义了Bean的自动装载方式。

    • no:不使用自动装配功能。
    • byName:通过Bean的属性名实现自动装配。
    • byType:通过Bean的类型实现自动装配。
    • constructor:类似于byType,但它是用于构造函数的参数的自动组装。
    • autodetect:通过Bean类的反省机制(introspection)决定是使用“constructor”还是使用“byType”。
  • (9)dependency-check(依赖检查,默认为“default”):它用来确保Bean组件通过JavaBean描述的所以依赖关系都得到满足。在与自动装配功能一起使用时,它特别有用。

    • none:不进行依赖检查。

    • objects:只做对象间依赖的检查。

    • simple:只做原始类型和String类型依赖的检查

    • all:对所有类型的依赖进行检查。它包括了前面的objects和simple。

  • (10)depends-on(依赖对象):这个Bean在初始化时依赖的对象,这个对象会在这个Bean初始化之前创建。

  • (11)init-method:用来定义Bean的初始化方法,它会在Bean组装之后调用。它必须是一个无参数的方法。

  • (12)destroy-method:用来定义Bean的销毁方法,它在BeanFactory关闭时调用。同样,它也必须是一个无参数的方法。它只能应用于singletonBean。

  • (13)factory-method:定义创建该Bean对象的工厂方法。它用于下面的“factory-bean”,表示这个Bean是通过工厂方法创建。此时,“class”属性失效。

  • (14)factory-bean:定义创建该Bean对象的工厂类。如果使用了“factory-bean”则“class”属性失效。

  • (15)autowire-candidate:采用xml格式配置bean时,将元素的autowire-candidate属性设置为false,这样容器在查找自动装配对象时,将不考虑该bean,即它不会被考虑作为其它bean自动装配的候选者,但是该bean本身还是可以使用自动装配来注入其它bean的。

  • (16)MutablePropertyValues:用于封装< property>标签的信息,其实类里面就是有一个 list,list 里面是 PropertyValue 对象,PropertyValue 就是一个 name 和 value 属性,用于封装< property>标签 的名称和值信息 。

  • (17)ConstructorArgumentValues:用于封装< constructor-arg>标签的信息,其实类里面就是有 一个 map,map 中用构造函数的参数顺序作为 key,值作为 value 存储到 map 中 。

  • (18)MethodOverrides:用于封装 lookup-method 和 replaced-method 标签的信息,同样的类里面有一个 Set 对象添加 LookupOverride 对象和 ReplaceOverride 对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/28644.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ADB安装及使用详解

一、ADB简介 1、什么是adb ADB 全称为 Android Debug Bridge&#xff0c;起到调试桥的作用&#xff0c;是一个客户端-服务器端程序。其中客户端是用来操作的电脑&#xff0c;服务端是 Android 设备。 ADB 也是 Android SDK 中的一个工具&#xff0c;可以直接操作管理 Androi…

K8s高可用集群搭建

K8s高可用集群搭建1 方案简介2 集群搭建2.1 安装要求2.2 准备环境2.3 master节点部署keepalived2.4 master节点部署haproxy2.5 所有节点安装docker/kubeadm/kubelet2.6 部署k8smaster012.7 安装集群网络2.8 k8smaster02加入节点2.9 k8snode01加入集群3 测试集群1 方案简介 用到…

Session-based Recommendation with Graph Neural Networks论文阅读笔记

1. Abstract &#xff08;1&#xff09;基于会话的推荐问题旨在基于匿名会话来预测用户的行为。 The problem of session-based recommendation aims to predict user actions based on anonymous sessions. &#xff08;2&#xff09; 以前的方法存在的不足&#xff1a;不足以…

day3-day4【代码随想录】长度最小的子数组

文章目录前言一、长度最小的子数组1、暴力求解&#xff1a;2、滑动窗口求解&#xff1a;二、最小覆盖子串&#xff08;乐扣76&#xff09;难难难难难三、水果成篮&#xff08;乐扣904&#xff09;四、最长重复子数组&#xff08;乐扣718&#xff09;前言 实现滑动窗口&#xf…

Android抓包工具——Fiddler

前言 &#x1f525;在平时和其他大佬交流时&#xff0c;总会出现这么些话&#xff0c;“抓个包看看就知道哪出问题了”&#xff0c;“抓流量啊&#xff0c;payload都在里面”&#xff0c;“这数据流怎么这么奇怪”。 &#x1f449;这里出现的名词&#xff0c;其实都是差不多的…

矩阵分析:特征值分解

矩阵分析&#xff1a;特征值分解前置知识空间变换伸缩旋转对称矩阵对称矩阵对角化正交矩阵向量的基基变换不同基下的向量变换逆矩阵不同基下的空间变换内积的几何意义特征值、特征向量特征值分解代码前置知识 空间变换 伸缩 一个矩阵其实就是一个线性变换&#xff0c;因为一个…

SpringCloud微服务(六)——Gateway路由网关

Gateway路由网关 Spring Cloud Spring Cloud Gateway统一访问接口的路由管理方式 作用 整合各个微服务功能&#xff0c;形成一套系统微服务网关实现日志统一纪录实现用户的操作跟踪统一用户权限认证路由转发、跨域设置、负载均衡、服务限流反向代理 微服务网关的概述 不同…

H2DCFDA | ROS 荧光探针检测法

H2DCFDA 工作液的配制1、储存液的配制&#xff1a;用 DMSO 配制 10 mM 的 H2DCFDA (2,000)&#xff0c;如用 1.03 mL DMSO 溶解 5 mg H2DCFDA。注&#xff1a;H2DCFDA 储存液建议分装后-20℃ 避光冻存&#xff0c;一个月。-80 半年。2、工作液的配制&#xff1a;用预热好的无血…

绘制文字(QFont字体)

QPainter绘制文字的话使用的函数为 QPainter::drawText() QPainter::drawText()有多种重载方式。 根据坐标直接绘画文字&#xff1a; void Widget::paintEvent(QPaintEvent *event)//绘图事件 {QPainter painter(this);painter.translate(100,100);//移动坐标painter.drawText(…

E. Sending a Sequence Over the Network(DP)

Problem - 1741E - Codeforces 序列a在网络上的发送情况如下。 序列a被分割成若干段&#xff08;序列的每个元素正好属于一个段&#xff0c;每个段是序列的一组连续元素&#xff09;。 对于每个段&#xff0c;它的长度被写在它的旁边&#xff0c;要么在它的左边&#xff0c;要…

递归展示树状图/树状表格

递归展示树状图一、数据库表设计二、后端java递归代码三、前端展示树状表格四、效果展示一、数据库表设计 这里我们采用自关联的设计&#xff0c;通过id和pid的对应来确认数据的上下级关系 建表语句&#xff0c;我这里把一级菜单的pid设置成了0 /*Navicat Premium Data Transfe…

Spring中Bean的作用域和生命周期

目录 Bean的作用域 singleton prototype request session application websocket 单例作用域和全局作用域的区别 Bean的生命周期 Bean的作用域 Bean的作用域是指Bean在Spring整个框架中的某种行为模式&#xff0c;比如singleton单例作用域&#xff0c;就表示Bean在整…

大数据Spark面试题2023

文章目录Spark核心——RDD概念特点创建方式RDD的分区依赖关系Spark的shuffle介绍Spark的 Partitioner 分区器都有哪些?Spark中的算子都有哪些RDD工作流&#x1f4cc;Spark运行模式(资源调度框架的使用&#xff0c;了解)&#x1f4cc;讲一下Spark 的运行架构一个spark程序的执行…

常用的框架技术-08 ElasticSearch分布式、高扩展、高实时的搜索与数据分析引擎

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录1.ElasticSearch 概述1.1 ElasticSearch介绍1.2 全文搜索引擎1.3 lucene介绍1.4 倒排索引1.5 elasticsearch、solr对比2.ElasticSearch安装2.1 下载软件2.2 windows环…

【web渗透思路】框架敏感信息泄露(特点、目录、配置)

目录 一、挖掘思路 1、方法&#xff1a; 二、框架之信息泄露 1、Webpack 1.1、简述 1.2、.js.map文件泄露 1.3、源码审计 2、Spring boot 1.1、简述 1.2、利用 1.3、框架识别 &#xff08;基本分析方法都是一样&#xff0c;这里就举2个框架关于信息泄露方面的&#x…

Mybatis分页功能

1. 功能分析 如图所示分页功能&#xff0c;包括上一页、下一页、中间显示的当前页前后页码、全部页码以及跳转到XX页。手写的话实现起来很难&#xff0c;Mybatis给我们提供了插件&#xff0c;所提供的方法&#xff0c;直接包含了上述分页的相关数据。 2. 分页插件的使用及其相关…

虚拟环境下把python代码打包成exe(小白教程)

本教程适用于小白&#xff0c;本人也是小白&#xff0c;不妥之处还请包涵。 1、系统环境下安装 virtualenv 可以理解为 直接打开 系统的cmd安装 pip32 install virtualenv我之所以用pip32因为我电脑上装了两个版本的python 一个是32位一个是64位&#xff0c;如果你电脑上只有一…

为什么选择快速应用开发

如今&#xff0c;企业想要持续蓬勃发展&#xff0c;就需要具备快速满足客户期望的能力。无论是十几年历史的重要市场占有者推出新的APP&#xff0c;还是在疫情期间从线下转向线上电商营销&#xff0c;企业都需要主动适应市场。随着为客户提供新的服务方式&#xff0c;员工也需要…

如何轻松部署快解析 + WAMP

快解析是由北京金万维公司自主研发的域名解析工具&#xff0c;服务器端简单&#xff0c;通过快速部署就能实现在任何地域、任何时间、任何网络环境下快速访问到局域网内搭建的各类办公系统和各种应用。以发布网站服务为例&#xff0c;给大家演示下如何通过快解析实现外网访问WA…

一文带你看透短信验证码

短信验证码应用于我们生活、工作的方方面面&#xff0c;比如注册登录账号、支付订单、修改密码等等。验证码短信主要出于安全的考虑&#xff0c;防止应用/网站被恶意注册&#xff0c;恶意攻击&#xff0c;对于网站、APP而言&#xff0c;大量的无效注册&#xff0c;重复注册&…