Spring-IoC 基于xml管理

news2024/10/13 2:15:51
现大多使用注解方式,xml方式并不简洁,本文仅记录xml用作基础学习。

0、前提 

首先在父项目的pom.xml中配置好依赖们。然后子模块也可以使用这些依赖。
  • 在resource目录下创建Spring的xml文件,名称无要求,本文使用bean.xml。文件最上头的几行为约束,表示可以用哪些标签等,如要使用其他标签,需先在此处添加对应的三行(xmlns:标签名=".../标签名"、xsi:schemaLocation="...  ...",都把链接的末尾改为标签名)
  • 在bean.xml文件中写bean标签:id为类的唯一标识,class为类的全类名(包名+类名)

  • 根据bean.xml文件创建IoC容器

一、获取Bean:

有三种方式获取bean,基于id、基于class、基于id和class一起使用。

1. 根据id获取:getBean("id")

 2. 根据类型获取:getBean(类名.class)

注意事项:
当根据类型获取bean时,要求IoC容器中指定类型的bean有且只能有一个。
当IOC容器中一共配置了多个,根据类型获取时会抛出异常。
期望匹配单实例的bean,但发现了两个,IoC不知道找谁:
只能使用其他两种方式。
 扩展:

接口不能new,只能new接口的实现类。

使用实现类的类型可以获取到bean,所以此处试验接口类型能不能获取bean。

  • 如果组件类实现了接口,根据接口类型可以获取 bean 吗?
        可以,前提是bean唯一
接口UserDao,实现类UserDaoImpl。

  • 如果一个接口有多个实现类,这些实现类都配置了 bean,根据接口类型可以获取 bean 吗?
        不行,因为bean不唯一
接口UserDao,实现类UserDaoImpl、PersonDaoImpl。

 原因与注意事项类似,不知道找谁。
结论: 

        根据类型来获取bean时,在满足bean唯一性的前提下,其实只是看:[对象 instanceof指定的类型」的返回结果,只要返回的是true就可以认定为和类型匹配,能够获取到。

        java中,instanceof运算符用于判断前面的对象是否是后面的类,或其子类、实现类的实例。如果是返回true,否则返回false。也就是说:用instanceof关键字做判断时,instanceof操作符的左右操作必须有继承或实现关系

3. 根据id和类型获取:getBean("id", 类名.class) 


二、依赖注入

依赖注入是指在创建对象时,给属性设置值。

原始写法:通过set方法和有参构造器赋值

有两种实现方式:Setter和构造器。

1. 基于Setter注入:<property>

  • 首先创建类,定义属性和set方法

        在类前使用lombok的@Data注解可以不用手动get、set、toString等。

  • 在bean.xml配置文件中写bean标签,使用<property>标签调用set方法赋值。

        name为属性,value为具体赋值。

2. 基于构造器注入:<constructor-arg>

  • 首先创建类,定义属性和有参构造方法
  • 在bean.xml配置文件中写bean标签,使用<constructor-arg>标签调用有参构造方法赋值。

        name为属性,value为具体赋值。(name也可以用index索引但不推荐,因为顺序要一致)


3. 特殊值处理

3.1 字面量

字面量没有引申含义,就是我们看到的这个数据本身。

使用value属性给bean的属性赋值时,Spring会把value属性的值看做字面量

3.2 null-空值

不能写成如下形式,此时为name属性赋值null字符串

3.3 xml实体:转义

        &lt; 

3.4 CDATA节:<![CDATA[...]]>

4. 特殊类型属性注入 

4.1 对象类型属性

一个类对象中有属性是另一个对象,例如在员工对象中有一个部门对象。

有三种方式:

4.1.1 引用外部bean——ref

在bean.xml中写好两个类的bean,部门bean和员工bean。

在员工bean的部门属性中用ref代替value赋值,ref="部门bean的id"

4.1.2 内部bean

在bean.xml中写员工bean,在员工bean的部门属性中声明部门bean。

4.1.3 级联属性赋值

在引用外部bean的基础上,使用对象.属性可以改变值。

4.2 数组类型属性——<array>标签

员工有多个爱好,用数组表示。

4.3 集合类型属性

4.3.1 List集合——<List>标签

一个部门有多个员工,部门对象bean中有一个员工类型的List。

因为员工是对象类型所以用ref引用外部bean,如果是字符串或其他,用value。

4.3.2 Map集合——<map><entry><key><value><ref>标签

也可以用map-key/value,一个学生有多个老师

4.3.3 引用集合类型的bean——<util:list><util:map>

 由于要使用util标签,要先在bean.xml文件的最上头引入util,否则不能用:

一个学生有多门课-List,多个老师-Map,课和老师为对象类型。

两个lesson对象bean:

两个teacher对象bean:

 student的bean:ref为对应util的id

4.4  p命名空间

要使用p标签,在bean.xml文件最上添加:

使用p命名空间,可以用:p:属性="值"进行赋值,而不用name、value了。

5. 引入外部属性文件

由于bean.xml文件中有很多bean,不利于修改和维护,所以把一些特定的值放在外部文件中,在引入外部文件进行注入。修改时只需修改外部文件,而不用修改配置文件。

常见的如数据库。

5.1 首先在pom.xml文件中添加数据库驱动和数据源等相关依赖。

5.2 创建外部属性文件(resource目录下),一般是.properties后缀格式,定义数据库信息,此处为jdbc.properties

=左边为名字,右边为赋值

5.3 引入外部属性文件:先在bean.xml最上头引用context名称空间,使用<context>标签引入外部属性文件,在bean中的value使用${}表达式完成注入

location为外部属性文件类路径: 

 class为德鲁伊连接池对象路径,value使用外部文件中的名字:

 测试:


三、bean的作用域-scope

注意创建时机不同。

1. 单实例:

两个对象为同一个

 2. 多实例:

两个对象不同


四、bean的生命周期

bean对象从创建到销毁的过程。

1. 生命周期过程:

  1. bean对象创建(调用无参构造器)
  2. 给bean对象设置属性(set方法)
  3. bean的后置处理器(初始化之前)
  4. bean对象初始化(需在配置bean时指定初始化方法)
  5. bean的后置处理器(初始化之后)
  6. bean对象就绪可以使用
  7. bean对象销毁(需在配置bean时指定销毁方法)
  8. IOC容器关闭

2. 后置处理器:

        实现BeanPostProcessor接口,并重写两个方法:postProcessBeforeInitialization和postProcessAfterInitialization。

        还需在IoC容器中配置后置处理器,需要注意的是,bean后置处理器不是单独针对某一个bean生效,而是针对IoC容器中所有bean都会执行

class为接口实现类的全类名:

3. 测试

 

 输出:


五、FactoryBean

        FactoryBean是Spring的一种常用机制。帮我们把复杂组件创建的详细过程和繁琐细节都屏蔽起来。和普通的bean不同,配置一个FactorvBean类型的bean,在获取bean的时候得到的并不是class属性中配置的这个类的对象,而是getObject()方法的返回值决定创建什么对象。
        将来整合Mybatis时,Spring就是通过FactoryBean机制来帮我们创建SqlSessionFactory对象的。

使用:

实现FactoryBean接口的类,重写getObject()方法,返回一个对象。

 配置文件:

getBean("user")返回的user对象,而不是class的MyFactoryBean对象。

六、基于xml的自动装配

不使用自动装配即上述中的二、4.1部分使用ref。

在IoC容器匹配bean时,自动为该bean依赖的类类型、接口类型的属性赋值。

有两种方式:byName和byType

创建三个包,controller、Service、dao,其中controller包下有一个UserController类,Service包下有userService接口和实现该接口的userServiceImpl类,dao包下有userDao接口和实现该接口的userDaoImpl类。

1. 在bean.xml中的bean标签内使用autowired ="byType",在IoC容器中根据类型找bean自动装配。最好保证bean唯一
如果没有找到匹配的类型,则该属性不匹配,默认赋值为null。如果找到多个,抛出异常NoUniqeBeanDefinitionException。

 2. autowired ="byName",需保证id标识与类定义中的属性名称一致

 不一致则报错,会赋空值。

参考:b站尚硅谷 

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

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

相关文章

CSS之第一个CSS样式和CSS选择符

前端这些博客&#xff0c;我觉得都是固定的语法&#xff0c;故而不会以过多的文字进行描述&#xff0c;本系列博文均以实例和代码介绍的方式进行&#xff0c;主要按照代码进行。不会以过多的文字描述。 第一个CSS样式 <!DOCTYPE html> <html lang"en">…

SVD图像处理(MATLAB)

使用SVD处理图像模拟演示 参考文献 https://github.com/matzewolf/Image_compression_SVD/blob/master/svd_compress.m MATLAB代码 clc; clearvars; close all;A_orgimread("lena256.bmp"); compr20; A_orgdouble(A_org);A_red svd_compress( A_org, compr ); s…

2023最新汽车网络安全报告汇总

2023最新汽车网络安全报告、安全参考架构及指南汇总&#xff0c;供大家学习参考。https://t.zsxq.com/18RkG260k 汽车信息安全法律法规及标准全景图V3.2.pdf 车载智能计算基础平台参考架构2.0.pdf 车载智能计算芯片白皮书(2023版).pdf 智能驾驶行为安全评价方法发布版.pdf 智能…

大数据实验统计-1、Hadoop安装及使用;2、HDFS编程实践;3、HBase编程实践;4、MapReduce编程实践

大数据实验统计 1、Hadoop安装及使用&#xff1b; 一&#xff0e;实验内容 Hadoop安装使用&#xff1a; 1&#xff09;在PC机上以伪分布式模式安装Hadoop&#xff1b; 2&#xff09;访问Web界面查看Hadoop信息。 二&#xff0e;实验目的 1、熟悉Hadoop的安装流程。 2、…

【STM32嵌入式系统设计与开发】——16InputCapture(输入捕获应用)

这里写目录标题 STM32资料包&#xff1a; 百度网盘下载链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1mWx9Asaipk-2z9HY17wYXQ?pwd8888 提取码&#xff1a;8888 一、任务描述二、任务实施1、工程文件夹创建2、函数编辑&#xff08;1&#xff09;主函数编辑&#…

进制转换器(C语言)

目录 1问题&#xff1a; 输入任意进制的数值&#xff0c;可以转换成任意进制的数值&#xff08;2到36进制&#xff09;; 2思路&#xff1a; 3代码&#xff1a;&#xff08;需要运用到数据结构栈的知识&#xff09; 4运行结果&#xff1a; 1问题&#xff1a; 输入任意进制的数…

使用 LLMLingua-2 压缩 GPT-4 和 Claude 提示

原文地址&#xff1a;Compress GPT-4 and Claude prompts with LLMLingua-2 2024 年 4 月 1 日 向大型语言模型&#xff08;LLM&#xff09;发送的提示长度越短&#xff0c;推理速度就会越快&#xff0c;成本也会越低。因此&#xff0c;提示压缩已经成为LLM研究的热门领域。 …

RK3568 RTC驱动实验

RK3568 RTC驱动实验 1. RTC简介 ​ RTC 也就是实时时钟&#xff0c;用于记录当前系统时间&#xff0c;对于 Linux 系统而言时间是非常重要的&#xff0c;使用 Linux 设备的时候也需要查看时间。RTC是Linux的时间系统。 ​ RTC 设备驱动是一个标准的字符设备驱动&#xff0c;…

R语言数据挖掘:随机森林(1)

数据集heart_learning.csv与heart_test.csv是关于心脏病的数据集&#xff0c;heart_learning.csv是训练数据集&#xff0c;heart_test.csv是测试数据集。要求&#xff1a;target和target2为因变量&#xff0c;其他诸变量为自变量。用决策树模型对target和target2做预测&#xf…

ESP32学习---ESP-NOW(一)

ESP32学习---ESP-NOW&#xff08;一&#xff09; 官网简介arduino 官网简介 首先看官网的介绍&#xff1a;https://www.espressif.com.cn/zh-hans/solutions/low-power-solutions/esp-now ESP-NOW 是乐鑫定义的一种无线通信协议&#xff0c;能够在无路由器的情况下直接、快速…

使用deepspeed,transformers,safetensor中常见的训练精度,共享权重问题

使用deepspeed可能需要注意精度问题 混合精度&#xff0c;LayerNorm 虽然deepspeed有混合精度训练的功能&#xff0c;但是对于网络上各种奇奇怪怪的代码的DIY转化中&#xff0c;他还是很弱小的。它的精度问题&#xff0c;使用deepspeed如果模型中有部分模型使用的是half精度&a…

Ubuntu22.04安装Anaconda

一、下载安装包 下载地址&#xff1a;https://www.anaconda.com/download#Downloads 参考&#xff1a;Ubuntu下安装Anaconda的步骤&#xff08;带图&#xff09; - 知乎 下载Linux 64-Bit (x86) installer 二、安装 在当前路径下&#xff0c;执行命令&#xff1a; bash Ana…

机器学习——几个线性模型的简介

目录 形式 假设 一元回归例子理解最小二乘法 多元回归 广义线性回归 对数线性回归 逻辑回归 线性判别分析 形式 线性说白了就是初中的一次函数的一种应用&#xff0c;根据不同的(x,y)拟合出一条直线以预测&#xff0c;从而解决各种分类或回归问题&#xff0c;假设有 n …

外链工具源码版V1

请将zip文件全部解压缩即可访问&#xff01; 源码全部开源&#xff0c;支持上传二级目录访问 #已更新增加大量高质量外链&#xff08;若需要增加修改其他外链请打开txt文件&#xff09; #修复优化页面端 源码下载地址&#xff1a;外链工具源码版V1

基于k8s的web服务器构建

文章目录 k8s综合项目1、项目规划图2、项目描述3、项目环境4、前期准备4.1、环境准备4.2、ip划分4.3、静态配置ip地址4.4、修改主机名4.5、部署k8s集群4.5.1、关闭防火墙和selinux4.5.2、升级系统4.5.3、每台主机都配置hosts文件&#xff0c;相互之间通过主机名互相访问4.5.4、…

Rust---复合数据类型之枚举、数组

目录 枚举的使用Option 枚举数组的使用输出结果 枚举&#xff08;Enum&#xff09;&#xff1a;表示一个类型可以有多个不同的取值。枚举类型可以包含不同的变体&#xff08;variants&#xff09;&#xff0c;每个变体可以有不同的数据类型。 枚举的使用 enum Direction {Up,…

Linux-Arm GDB调试(本地和远程)

目录 问题描述 已有coredump 没有coredump 小结 问题描述 Linux本机调试使用GDB非常方便&#xff0c;但嵌入式Linux设备资源有限&#xff0c;通常并没有交叉编译工具&#xff0c;那嵌入式设备上的应用发生问题如何查找问题&#xff1f;通常IDE有远程DEBUG功能&#xff0c;这…

【计算机视觉】四篇基于Gaussian Splatting的SLAM论文对比

本文对比四篇论文&#xff1a; [1] Gaussian Splatting SLAM [2] SplaTAM: Splat, Track & Map 3D Gaussians for Dense RGB-D SLAM [3] Gaussian-SLAM: Photo-realistic Dense SLAM with Gaussian Splatting [4] GS-SLAM: Dense Visual SLAM with 3D Gaussian Splatting …

MySQL数据库 数据库基本操作(一):数据库的认识与基本操作

1. 数据库的基本认识 1.1 什么是数据库 专家们设计出更加利于管理数据的软件——数据库&#xff0c;它能更有效的管理数据。数据库可以提供远程服务&#xff0c;即通过远程连接来使用数据库&#xff0c;因此也称为数据库服务器。 1.2 数据库的分类 数据库可以大体分为:关系…

基于Python的简单颜色替换

当我们临时需要改变一个照片的颜色&#xff0c;使其符合我们想要的主题色时&#xff0c;对于不会PS的我就只能使用一下Python来实现这个简单的过程 比如我想要中国农大农学院的院徽&#xff0c;但在官网上提取出来的图片是白色的 而我想要符合农学主题的绿色&#xff0c;将图片…