Spring中的Bean的管理(史上最全)

2023-05-16

1.BeanFactory接口

本文介绍Spring里的BeanFactory。包括:BeanFactory 和 FactoryBean的ApplicationContext的委托。

BeanFactory 和 FactoryBean

 

Spring的本质是一个bean工厂(beanFactory)或者说bean容器,它按照我们的要求,生产我们需要的各种各样的bean,提供给我们使用。只是在生产bean的过程中,需要解决bean之间的依赖问题,才引入了依赖注入(DI)这种技术。也就是说依赖注入是beanFactory生产bean时为了解决bean之间的依赖的一种技术而已。

beanFactory会在bean的生命周期的各个阶段中对bean进行各种管理,并且spring将这些阶段通过各种接口暴露给我们,让我们可以对bean进行各种处理,我们只要让bean实现对应的接口,那么spring就会在bean的生命周期调用我们实现的接口来处理该bean.

在介绍BeanFactory前,我们先想一个问题。我们都知道BeanFactory主要的内容是帮我们生成Bean信息和管理Bean信息,那么我们在xml文件中<baen>属性的时候。Spring是如何帮我们生成Bean.

 

BeanFactory

接口具体实现类

1. DefaultListableBeanFactory

BeanFactory接口体系的默认实现类,实现以上接口的功能,提供BeanDefinition的存储map,Bean对象对象的存储map。

其中Bean对象实例的存储map,定义在FactoryBeanRegistrySupport,FactoryBeanRegistrySupport实现了SingletonBeanRegistry接口,而DefaultListableBeanFactory的基类AbstractBeanFactory,继承于FactoryBeanRegistrySupport。

2. StaticListableBeanFactory

    用于存储给定的bean对象实例,不支持动态注册功能,是ListableBeanFactory接口的简单实现。

beanFactoty后置处理器: BeanFactoryPostProcessor

benFactoryPostProCessor是BeanFactory的后置处理器:

在BeanFactory创建好,加载好其所包含的所有beanDefinitions,但是还没有实例化bean之前,执行,具体为调用postProcessBeanFactory方法。

1. 加载更多的bean元数据
ConfigurationClassPostProcessor,用于从BeanFactory中检测使用了@Configuration注解的类,对于这些类对应的BeanDefinitions集合,遍历并依次交给ConfigurationClassParser,ConfigurationClassBeanDefinitionReader处理,分别是处理与@Configuration同时使用的其他注解和将类内部的使用@Bean注解的方法,生成BeanDefinition,注册到BeanFactory。

2. 对bean元数据进行加工处理
BeanDefinition属性填充、修改:在postProcessBeanFactory方法中,可以对beanFactory所包含的beanDefinitions的propertyValues和构造函数参数值进行修改,如使用PropertyPlaceHolderConfigurer来对BeanDefinition的propertyValues的占位符进行填充、赋值。或者使用PropertyResourceConfigurer获取config文件中属性,对BeanDefinitions的相关属性进行赋值或者值覆盖。

bean对象后置处理器:BeanPostProcessor

Bean后置处理器:负责对已创建好的bean对象进行加工处理。

 主要是可以对新创建的bean实例进行修改,提供了一个类似于hook机制,对创建好的bean对象实例进行修改。

核心方法
postProcessBeforeInitialization:在创建好bean实例,但是在任何初始化回调执行之前,如InitializingBean的afterPropertiesSet,先执行该方法。


postProcessAfterInitialization:在创建好bean实例,并且所有的初始化回调都执行完了,如InitializingBean的afterPropertiesSet,再执行该方法。
 

至此:BeanFactory的Bean加载过程全部分析完成:

2.静态工厂实例化

首先创造静态工厂

 

 Bean2

 配置文件:

 

创建测试文件:

 

 3.实例工厂实例化

创建Bean

 创建实例化工厂

 xml配置:

 bean4test:

 

 
4.Spring中Singleton作用域和Prototype作用域

基本概念

singleton作用域就是单例模式;用spring容器实现单例模式

而prototype作用域可以理解为多例模式!

注意:单例模式哈希值只有一个,多例模式哈希值有两个!

编写以下代码:(xml主要配置)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 
    <bean class="singleandprodemo.demo.Bean2" id="bean2" scope="singleton"/>
    <bean class="singleandprodemo.demo.Bean1" id="bean1">
        <property name="bean2" ref="bean2"/>
    </bean>
</beans>

这里要注意bean1没有填写scope,这里没填的默认是scope为singleton

这里不多写出bean了

运行结果为:

 以及

 可见不同的spring上下文环境中实例的Bean是不一样的;

5.基于xml自动装配

自动装配是使用spring满足bean依赖的一种方法
spring会在应用上下文中为某个bean寻找其依赖的bean。 Spring中bean有三种装配机制,分别是:

    在xml中显式配置;
    在java中显式配置;
    隐式的bean发现机制和自动装配。

这里我们主要讲第三种:自动化的装配bean。
Spring的自动装配需要从两个角度来实现,或者说是两个操作:

    组件扫描(component scanning):spring会自动发现应用上下文中所创建的bean;
    自动装配(autowiring):spring自动满足bean之间的依赖,也就是我们说的IoC/DI;

组件扫描和自动装配组合发挥巨大威力,使得显示的配置降低到最少。

1.2 autowire byName (按名称自动装配)

由于在手动配置xml过程中,常常发生字母缺漏和大小写等错误,而无法对其进行检查,使得开发效率降低。采用自动装配将避免这些错误,并且使配置简单化。
测试:

    <bean id="dog" class="com.tian.dao.Dog"/>
    <bean id="cat" class="com.tian.dao.Cat"/>

    <bean id="user" class="com.tian.dao.User" autowire="byName">
    </bean>

 小结:

1.3 autowire byType (按类型自动装配)
使用autowire byType首先需要保证:同一类型的对象,在spring容器中唯一。如果不唯一,会报不唯一的异常。
1.3.1 修改bean配置

    <bean class="com.tian.dao.Dog"/>
    <!--    可以不用指定id 因为是按类型来查找的-->
    <bean class="com.tian.dao.Cat"/>

    <bean id="user" class="com.tian.dao.User" autowire="byType">
    </bean>
1.5 小结

@Autowired与@Resource异同:
1、@Autowired与@Resource都可以用来装配bean。都可以写在字段上,或写在setter方法上。

2、@Autowired默认按类型装配(属于spring规范),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用

3、@Resource(属于J2EE规范),默认按照名称进行装配,名称可以通过name属性进行指定。如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

它们的作用相同都是用注解方式注入对象,但执行顺序不同。@Autowired先byType,@Resource先byName。
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring中的Bean的管理(史上最全) 的相关文章

  • Python JSON dumps与loads傻傻分不清

    一 JSON基本概念 JSON代表JavaScript对象符号 它是一种轻量级的数据交换格式 xff0c 用于存储和交换数据 它是一种独立于语言的格式 xff0c 非常容易理解 xff0c 因为它本质上是自描述的 python中有一个内置包
  • tomcat 端口冲突问题的解决办法

    方法1 tomcat开机启动了 xff0c 你可以查看任务管理器 xff0c 把tomcat xff08 或者Apache tomcat xff09 的任务关了 方法 2 更改tomcat的8080端口 打开配置文件 xff08 如下 xf
  • 总结之知识图谱前沿技术课程

    前言正文参考文献 前言 写在前面 xff0c 本文的内容主要基于2017年12月2日在苏州大学举办的知识图谱前沿技术课程 xff08 感谢各位老师的talk xff0c 受益良多 xff09 以及本人在之前阅读的有关paper xff0c
  • Qt 5.15的源码编译(Windows)

    前言 xff1a 在技术革新如此之快的时代 xff0c Qt也在为适应这些变化发生着重大的改变 又一长期 3年 支持版Qt 5 15 LTS在2020年3月发布 xff0c 重大更新的大版本Qt 6 0也在2020年12月发布 但是 xff
  • 【vim编辑器的使用】

    目录 1 vim的编辑器的使用 1 1 vim 文件名 xff1a 表示将文件用vim编辑器打开 2 vim的三种编辑模式 2 1 命令模式 2 2 插入模式 2 3 底行模式 Vim 是从 vi 发展出来的一个文本编辑器 代码补完 编译及
  • gcc编译器

    GCC xff08 GNU Compiler Collection xff0c GNU编译器套件 xff09 是由GNU开发的编程语言译器 GNU编译器套件包括C C 43 43 Objective C Fortran Java Ada和G
  • send()函数recv()函数详解

    目录 1 send xff08 xff09 函数 2 recv xff08 xff09 函数 1 send xff08 xff09 函数 函数原型 xff1a ssize t send int sockfd const void buf s
  • 数据元素、数据项、数据对象的概念详解

    数据元素 xff1a 数据的基本单位 数据项 xff1a 独立包含的数据最小单位 若干数据项组成一个数据元素 数据对象 xff1a 相同数据元素的集合 若干数据元素组成数据对象
  • Linux解压压缩命令tar

    目录 一 tar tar命令打包 tar命令解压 选项解释 一 tar Linux系统中常用的压缩格式有 xff1a tar gz tar bz2 tar xz tar Z 可以用tar进行解压缩 tar命令打包 xff1a tar 选项
  • ubuntu服务器编译源码

    1 xff0c Vmware软件安装后 2 xff0c VMware workstation full 16 0 0 16894299 exe 3 xff0c 新建虚拟磁盘 xff0c 加载镜像文件 ubuntu 16 04 7 deskt
  • 3.1 Linux启动Shell

    系列文章目录 第1章 Linux Shell简介 第2章 Shell基础 第3章 Bash Shell基础命令 lt 本章所在位置 gt 第4章 Bash Shell命令进阶 第5章 Linux Shell深度理解 第6章 Linux环境变
  • IP地址打印格式

    在C语言中 xff0c 可以使用printf 函数打印IP地址 常见的方法是将IP地址转换为点分十进制格式 xff0c 并使用 s或 u u u u等格式说明符进行打印 以下是一些示例代码 xff1a 将IP地址转化为字符串并以 34 s
  • 子网掩码打印方式

    在C语言中 xff0c 可以使用printf 函数打印子网掩码 和打印IP地址类似 xff0c 常见的方法是将掩码转换为点分十进制格式 xff0c 并使用 s或 u u u u等格式说明符进行打印 以下是一些示例代码 xff1a 将子网掩码
  • realloc 用法 .

    最近在写source code时需要在数组的buffer小时重新申请一块buffer 故找了一些资料 xff0c 乖乖 xff0c 竟然原指针还可以 漂移 realloc 原型 xff1a extern void realloc void
  • 多个方面比较电路交换、报文交换和分组交换的主要优缺点

    xff08 1 xff09 电路交换 xff1a 由于电路交换在通信之前要在通信双方之间建立一条被双方独占的物理通路 xff08 由通信双方之间的交换设备和链路逐段连接而成 xff09 xff0c 因而有以下优缺点 优点 xff1a 由于通
  • LVDS,CML,LVPECL,VML接口详细介绍

    在平时的工作中 xff0c 经常会接触到各种差分电平的转换 xff0c 网上也有很多这样的资料 xff0c 但发现有些混乱 xff0c 所以找了TI的这份文档进行翻译 xff0c 一是系统的归类一下 xff0c 二是自己也能通过这个来加深理
  • Linux-网桥原理分析 .

    Linux 网桥原理分析 http biancheng dnbcw info linux 244269 html 目 录 1 前言 6 2 网桥的原理 7 2 1 桥接的概念 7 2 2 linux的桥接实现 8 2 3 网桥的功能 9 3
  • IP头、TCP头、UDP头详解以及定义

    一 MAC帧头定义 数据帧定义 xff0c 头14个字节 xff0c 尾4个字节 typedef struct MAC FRAME HEADER char m cDstMacAddress 6 目的mac地址 char m cSrcMacA
  • SGMII 和 Serdes 的详细说明

    Serdes xff1a SERDES是英文SERializer 串行器 DESerializer 解串器 的简称 它是一种时分多路复用 TDM 点对点的通信技术 xff0c 即在发送端多路低速并行信号被转换成高速串行信号 xff0c 经过
  • mips的内存管理-kseg0,kseg1虚拟和物理地址映射理解

    mips 24kf manual gliethttp pdf p89页 所以mips复位和中断发生 都会自动进入kernel模式 The core enters Kernel mode both at reset and when an e

随机推荐

  • Linux SSH Access denied(拒绝访问)解决方案

    新安装的 CentOS 7 使用 SSH 连接出现 Access denied xff0c 记录一下这个坑 详细问题如下 xff08 见图 xff09 xff1a 解决方案 查了下资料 xff0c Linux 系统默认就是禁止远程登录的 那
  • (数据结构与算法分析 一)------快速求幂算法,Java递归实现

    快速求幂算法 xff0c 递归实现 xff0c 其实算法的思想很简单 xff0c 但是感觉非常经典 xff0c 这个也是我开始看数据结构与算法分析这本书的开始把 xff0c 大学期间感觉就得深究一下算法 xff0c 课堂学习的太肤浅 xff
  • 字符串拷贝函数memcpy和strncpy以及snprintf 的性能比较

    问题 xff1a 函数memcpy dest src sizeof dest strncpy dest src sizeof dest 和snprintf dest sizeof dest s src 都可以将src字符串中的内容拷贝到de
  • snprintf函数使用总结

    一直有接触snprintf 经久不用知识点又会模糊 记录下来以便日后查看 依赖头文件 include lt stdio h gt 函数原型 int snprintf char str size t size const char forma
  • 如何在Ubuntu 18.04 LTS上使用UFW设置防火墙

    正确配置防火墙是整个系统安全中最重要的方面之一 默认情况下 xff0c Ubuntu 18 04 LTS 附带了一个名为 UFW xff08 Uncomplicated Firewall xff09 的防火墙配置工具 xff0c UFW 是
  • 全程技术干货:VR画面渲染性能是这样提升的

    本文您将了解到 xff1a 1 xff0c VR渲染面临什么问题 xff1f 2 xff0c 如何做好VR的渲染 xff1f 3 xff0c 怎样提升VR渲染的性能 xff1f 渲染对于VR内容的开发来说 xff0c 是非常重要的议题 但在
  • Python微信小程序,实现自动回复等功能(itchat模块)

    本文是使用Python的itchat模块进行微信私聊消息以及群消息的自动回复功能 xff0c 必须在自己的微信中添加微信号xiaoice ms xff08 微软的微信机器人 xff09 才能实现 xff0c 直接复制代码运行之后扫一扫二维码
  • 最大完全子图和极大连通子图

    最近学习图论的一串小结之一 完全图 amp 完全子图 amp 最大完全子图 完全图 xff1a 任意两点都恰有一条边相连的图 任意两点都相邻 完全子图 xff1a 满足任意两点都恰有一条边相连的子图 xff0c 也叫团 最大完全子图 xff
  • python3回溯找最大团

    最近学习图论的一串小结之三 数学概念见上上篇 xff1a 最大完全子图和极大连通子图 最大团问题分析可以移步这篇博文 xff1a 回溯 图论 最大团问题 xff08 求最大完全子图 xff09 代码一部分参考了这篇博文 xff1a pyth
  • python3关于经纬度、方向角、目标距离

    博主搞了半天haversin公式倒腾距离之后 xff0c 发现有现成的geopy可用 xff0c 且网上查到的一些函数用法似乎有改变 xff0c 遂整理如下 已知两点经纬度求距离 from geopy distance import geo
  • 零基础LSTM入门示例

    最近用pytorch搭了个LSTM模型 xff0c 由于博主两个都没基础 xff0c 所以查来查去兜了不少圈子 xff0c 干脆总结一个极简的LSTM代码示例 xff0c 供参考 仅使用了torch nn Module自定义模型 随便挑了a
  • 零基础自定义数据集入门示例

    总结一个简单的自定义数据集示例 假设数据文件存储在path中的txt文件中 xff0c 内容为 时间 xff0c 数据1 xff0c 数据2 xff0c 数据3 的列表 对应的标签存在label txt中 from torch utils
  • not executable: 64-bit ELF file 已解决

    not executable 32 bit ELF file 已解决 not executable 64 bit ELF file 已解决 如上二个问题 1 xff0c 在ubuntu系统中 gcc linaro 7 5 0 2019 12
  • 训练集、测试集、验证集,以及数据集切分代码

    区别一下三个概念 xff1a 训练集 xff1a 顾名思义 xff0c 用于训练模型 xff0c 调整网络中的权值 偏差等参数 测试集 xff1a 对模型能力进行评估 xff0c 调整学习率等超参 xff0c 使模型效果达到最优 验证集 x
  • AI编程软件会取代程序员吗?

    最近听到同事问了这样一个问题 xff0c 今天就来好好的唠一唠 xff0c 随着科学技术的发展 xff0c 现在生命上都已经开始出现AI编程软件了 不由得感叹 xff0c 一句现在时代发展还真快呀 xff01 然后我就和他一样产生了一种小小
  • Android MTK Keyguard 锁屏UI 分析

    注意有时候锁屏并不是 以apk的形式存在的 直接在系统内部有一个锁屏框架 源文件路径主要Android2 2和2 3版本 有两个 xff1a frameworks base policy src com android internal p
  • 机器人操作系统ROS是什么?

    目录 1 什么是ROS 2 ROS的许可协议 3 ROS的主要发行版本 4 ROS的主要功能 5 ROS的应用 6 ROS开发的常用工具 7 ROS的优点 8 ROS的缺点 1 什么是ROS ROS是机器人操作系统 xff08 Robot
  • grub menu.list 配置

    因重装系统 xff0c 把GRUB引导菜单搞没了 xff0c 一直不知道怎么找回来 xff0c 今天看到贴子 xff0c 试了下 xff0c 成功了 主要步骤是下边兰字部分t 而恢复Grub xff0c 其实也很简单的 xff1a 用Liv
  • Android 11 行为变更 :所有应用

    Android 11 平台包含一些行为变更 xff0c 这些变更可能会影响您的应用 以下行为变更将影响在 Android 11 上运行的所有应用 xff0c 无论其采用哪种 targetSdkVersion 都不例外 您应该测试您的应用 x
  • Spring中的Bean的管理(史上最全)

    1 BeanFactory接口 本文介绍Spring里的BeanFactory 包括 xff1a BeanFactory 和 FactoryBean的ApplicationContext的委托 BeanFactory 和 FactoryBe