Spring-IoC 基于xml管理

现大多使用注解方式,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站尚硅谷 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据实验统计-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、…

Educational Codeforces Round 133 (Rated for Div. 2) C. Robot in a Hallway

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e18, maxm 4e4 5; c…

探索async/await的魔力:简化JavaScript异步编程

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

软件设计师28--SQL语言

软件设计师28--SQL语言 考点1&#xff1a;普通查询SQL语言SQL语言 - 查询例题&#xff1a; 考点2&#xff1a;分组查询SQL语言 - 查询例题&#xff1a; 考点3&#xff1a;权限控制SQL语言例题&#xff1a; 考点1&#xff1a;普通查询 SQL语言 SQL语言 - 查询 例题&#xff1a;…

容器安全的防护之道

随着云计算的发展&#xff0c;云原生技术已经成为企业数字化转型的得力武器&#xff0c;如何保障容器安全&#xff0c;已成为企业最关心的问题。为此&#xff0c;德迅蜂巢原生安全平台由德迅云安全自主研发&#xff0c;能够很好集成到云原生复杂多变的环境中&#xff0c;如PaaS…

redis乱码\xac\xed\x00\x05t\x00H解决

发现数据库乱码&#xff1a; 这数据库是来自rdids队列list实现的一个简单队列&#xff0c;停止使用该list的服务&#xff0c;查看里面的值&#xff0c;发现 乱码\xac\xed\x00\x05t\x00H&#xff0c;如下图&#xff1a; 很明发送数据端的问题&#xff0c;检查代码&#xff1a; …

软考高级架构师:嵌入式系统概述

一、AI 讲解 嵌入式操作系统是一种专门设计来管理特定硬件的软件系统。它能够在资源有限的环境中高效运行&#xff0c;常见于嵌入式系统中&#xff0c;如智能家居设备、工业控制系统等。 下面将详细介绍嵌入式系统的架构、初始化过程和部件构成。 嵌入式系统的架构 嵌入式系…

【HTB】Trick 靶场

Trick靶场 地址&#xff1a;https://app.hackthebox.com/machines/477 打靶过程 靶机IP:10.129.227.180 1.信息收集 1.1 nmap 端口扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap -Pn -sC -sV -p- 10.129.227.180 --min-rate5000 Starting Nmap 7.94SVN ( https://nmap…

探索口腔系统功能架构的演变与未来

随着医疗技术的不断发展和人们对口腔健康的重视&#xff0c;口腔系统的功能架构也在不断演变。从传统的口腔诊疗到数字化的口腔健康管理&#xff0c;口腔系统的功能框架正在经历着翻天覆地的变化。本文将深入探讨口腔系统功能架构的演变历程以及未来发展趋势。 --- 随着社会的…

JavaScript(六)---【回调、异步、promise、Async】

零.前言 JavaScript(一)---【js的两种导入方式、全局作用域、函数作用域、块作用域】-CSDN博客 JavaScript(二)---【js数组、js对象、this指针】-CSDN博客 JavaScript(三)---【this指针&#xff0c;函数定义、Call、Apply、函数绑定、闭包】-CSDN博客 JavaScript(四)---【执…

阿里云弹性计算通用算力型u1实例性能评测,性价比高

阿里云服务器u1是通用算力型云服务器&#xff0c;CPU采用2.5 GHz主频的Intel(R) Xeon(R) Platinum处理器&#xff0c;ECS通用算力型u1云服务器不适用于游戏和高频交易等需要极致性能的应用场景及对业务性能一致性有强诉求的应用场景(比如业务HA场景主备机需要性能一致)&#xf…

某站价值5000的码支付多商户商业版 完美可运营版本PHP源码

一款非常好用的码支付即时到账PHP源码 互站网卖4999 买来之后 模板有点丑 自己更换了的一个好看点的 1.修改数据库 用户名 密码 数据库名 2.后台地址 你的域名/admin 账号admin 密码123456 3.通用的监控APP软件, 反编译一下修改成你平台的名字和图标即可 源码免费…

动规训练2

一、最小路径和 1、题目解析 就是一个人从左上往做下走&#xff0c;每次只能往右或者往下&#xff0c;求他到终点时&#xff0c;路径上数字和最小&#xff0c;返回最小值 2、算法原理 a状态表示方程 小技巧&#xff1a;经验题目要求 用一个二维数组表示&#xff0c;创建一个…

(4)(4.6) Triducer

文章目录 前言 1 安装triducer 2 故障排除 3 参数说明 前言 Triducer 集速度、温度和深度传感器于一体。埃文在这篇 ardupilot.org 博文底部提供了这些说明(Evan at the bottom of this ardupilot.org blog post)。 1 安装triducer 下面的示例提供了在 Pixhawk 上安装 tri…

javaWeb城市公交查询系统的设计与实现

一、选题背景 随着低碳生活的普及&#xff0c;人们更倾向于低碳环保的出行方式&#xff0c;完善公交系统无疑具有重要意义。公交是居民日常生活中最常使用的交通工具之一&#xff0c;伴随着我国经济繁荣和城市人口增长&#xff0c;出行工具的选择也变得越来越重要。政府在公共…

使用vuepress搭建个人的博客(一):基础构建

前言 vuepress是一个构建静态资源网站的库 地址:VuePress 一般来说,这个框架非常适合构建个人技术博客,你只需要把自己写好的markdown文档准备好,完成对应的配置就可以了 搭建 初始化和引入 创建文件夹press-blog npm初始化 npm init 引入包 npm install -D vuepress…

涂鸦 IoT 开发平台产品开发使用教程

产品开发 一、涂鸦 IoT 平台 地址。 什么是涂鸦 IoT 开发平台&#xff1f; 涂鸦 IoT 开发平台支持海量物联网&#xff08;IoT&#xff09;设备、网关、服务、应用连接上云。在 产品开发 阶段&#xff0c;涂鸦 IoT 开发平台提供了多种连接方式&#xff0c;实现设备与 Io…

最新梨花带雨网页音乐播放器

源码简介 最新梨花带雨网页音乐播放器二开优化修复美化版全开源版本源码下载 梨花带雨播放器基于thinkphp6开发的XPlayerHTML5网页播放器前台控制面板,支持多音乐平台音乐解析。二开内容&#xff1a;修复播放器接口问题&#xff0c;把接口本地化&#xff0c;但是集成外链播放…

【系统架构师】-软件架构评估

1、质量属性 1、性能 系统的响应能力&#xff0c;响应时间、吞吐量&#xff0c; 策略&#xff1a;优先级队列、资源调度 2、可用性 系统正常运行的时间比例&#xff08;两次故障之间的时间长度&#xff09;&#xff0c;故障间隔时间&#xff0c; 策略&#xff1a;冗余、心…

JavaScript基础代码练习之翻转数组

一、要求将给定数组 [red, green, blue, pink, purple] 的内容反转存放&#xff0c;并将结果输出到控制台。 二、编写代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" cont…