Spring:IoC容器(基于XML管理bean)

1. HelloWorld

三个步骤:

1.创建类

2.配置xml文件

3.通过xml文件使得bean实列化

1. 创建类 

package com.itgyl.bean;public class HelloWorld {public HelloWorld() {System.out.println("1.通过无参构造创建对象");}public void hello() {System.out.println("hello world");}
}

2. 配置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 id="helloWorld" class="com.itgyl.bean.HelloWorld"></bean><!--如果对同一个类配置两次bean会报错:org.springframework.beans.factory.NoUniqueBeanDefinitionException:No qualifying bean of type 'com.itgyl.bean.HelloWorld' available:expected single matching bean but found 2: helloWorld,hello--><!--<bean id="hello" class="com.itgyl.bean.HelloWorld"></bean>-->
</beans>

3. bean实例化

@Testpublic void testHello() {//1.配置xml配置信息//2.通过xml配置信息获取管理对象的IOC容器ApplicationContext ac =new ClassPathXmlApplicationContext("bean.xml");//3.通过bean.xml中的配置信息将类实例化HelloWorld hw = (HelloWorld) ac.getBean("helloWorld");System.out.print("2.配置信息创建对象:");hw.hello();logger.info("执行成功,打印日志");}

2. 实例化bean的三种方式

@Testpublic void testGetBean() {//通过xml获取管理对象IOC容器ApplicationContext ac =new ClassPathXmlApplicationContext("bean.xml");//1.通过id获取bean对象HelloWorld hw1 = (HelloWorld) ac.getBean("helloWorld");System.out.print("通过id获取bean实例化对象:");hw1.hello();//2.通过class类获取bean对象HelloWorld hw2 = ac.getBean(HelloWorld.class);System.out.print("通过class获取bean实例化对象");hw2.hello();//3.通过id和class类获取bean实例化对象HelloWorld hw3 = ac.getBean("helloWorld", HelloWorld.class);System.out.print("通过id和class获取bean实例化对象");hw3.hello();}

注意事项

当接口被多个bean实现时无法通过接口调用实例化bean的方法

package com.itgyl.bean;public class StudentDao implements UserDao{@Overridepublic void run() {System.out.println("student run");}
}
package com.itgyl.bean;public class PersonDao implements UserDao{@Overridepublic void run() {System.out.println("person run");}
}
@Testpublic void testDetail() {ApplicationContext ac =new ClassPathXmlApplicationContext("bean.xml");/**** 当接口只有唯一一个bean实现时可以通过接口调用bean的方法* 当接口被多个类同时实现时无法通过接口调用bean的方法,此时接口不知道调用哪个bean重写的方法*/System.out.println("报错:一个接口被多个类同时实现无法通过接口调用方法,此时接口不知道调用哪个类的方法");UserDao ud = ac.getBean(UserDao.class);ud.run();}

如果组件类实现了接口,根据接口类型可以获取 bean 吗?

> 可以,前提是bean唯一

如果一个接口有多个实现类,这些实现类都配置了 bean,根据接口类型可以获取 bean 吗?

> 不行,因为bean不唯一

3. bean属性值赋值方式

3.1 setter方式注入

<!--
1.set方式注入
property标签:通过set和get方法对对象进行属性赋值
name: 为对象的属性名
value:为对象的属性值
-->

此时会先通过无参构造创建实例化对象,再通过bean中的set方法进行赋值

<bean id="student1" class="com.itgyl.di.Student"><property name="studentName" value="zhangsan"></property><property name="age" value="18"></property></bean>

 3.2 constructor方式注入

<!--
2.constructor方式注入
constructor-arg标签:通过构造方法使对象实例化
可通过index:index下标从0开始,对应构造方法第一个属性,以此类推
可通过name:赋值可property一致
-->

 此时通过有参构造直接进行赋值,所有有参构造器必须实现

<bean id="student2" class="com.itgyl.di.Student"><constructor-arg name="studentName" value="lisi"></constructor-arg><constructor-arg name="age" value="19"></constructor-arg></bean>

 4. 特殊值处理方式

<!--
特殊值:
1.字面常量值:如10,20...
2.null值:通过null标签进行赋值
3.xml实体:在html中有些符号有特殊符号需要转义。如:尖括号<>:转移后&lt; h1 &gt
4.![CDATA[]]

2. null值需通过标签进行赋值,如果此时value="null"即赋值为字符串null而不是空值 

<bean id="student3" class="com.itgyl.di.Student"><property name="studentName"><null></null></property><property name="age" value="18"></property></bean>

 3.xml配置文件使用前端标签进行配置,有些符号有特殊含义,故需要通过转义字符进行转义

<bean id="student3" class="com.itgyl.di.Student"><property name="studentName" value="&lt; hello &gt;"></property></bean>

4.通过 !CDATA[ 值 ]] 方式赋值

<bean id="student3" class="com.itgyl.di.Student"><property name="studentName"><value><![CDATA[ hello ]]></value></property></bean>

5. bean属性赋值

5.1 为bean属性为对象赋值

bean中有属性为对象时,若要为该属性赋值需通过ref进行引入,若直接通过value赋值会报错

定义两个类

public class Emp {private Dept dept;private String empName;private int id;
public class Dept {private String deptName;private int deptId;private List<Emp> list;

1. 外部引入bean 

<!--1.外部引入bean--><bean id="dept1" class="com.itgyl.beandi.Dept"><!--注入普通属性值--><property name="deptName" value="开发部"></property><property name="deptId" value="10086"></property></bean><bean id="emp1" class="com.itgyl.beandi.Emp"><!--注入对象属性值,需要使用ref即从什么地方引用--><property name="dept" ref="dept1"></property></bean>

2. 内部引入bean

 <!--2.内部引入bean--><bean id="emp2" class="com.itgyl.beandi.Emp"><!--注入对象属性值,内部引入--><property name="dept"><bean class="com.itgyl.beandi.Dept" id="dept2"><property name="deptName" value="管理部"></property><property name="deptId" value="10088"></property></bean></property><!--注入普通属性值--><property name="empName" value="张三"></property><property name="id" value="007"></property></bean>

3. 级联赋值

<!--3.级联赋值--><bean class="com.itgyl.beandi.Dept" id="dept3"><property name="deptName" value="鸡术研发部"></property></bean><bean class="com.itgyl.beandi.Emp" id="emp3"><property name="empName" value="王五"></property><!--级联赋值中先引入bean才能进行赋值--><property name="dept" ref="dept3"></property><property name="dept.deptName" value="技术研发部"></property></bean>

 5.2 为bean属性为数组赋值

<!--给对象中的数组赋值--><bean class="com.itgyl.beandi.People" id="people"><property name="hobby"><!--给数组赋值需要用到标签<array>--><array><value>吃饭</value><value>睡觉</value><value>打游戏</value></array></property></bean>

5.3 为bean属性为集合赋值

5.3.1 为List集合赋值

public class Dept {private String deptName;private int deptId;private List<Emp> list;
<!--配置两个bean实例化对象--><bean class="com.itgyl.beandi.Emp" id="emp1"><property name="empName" value="张三"></property><property name="id" value="001"></property></bean><bean class="com.itgyl.beandi.Emp" id="emp2"><property name="empName" value="李四"></property><property name="id" value="007"></property></bean><bean class="com.itgyl.beandi.Dept" id="dept"><!--注入集合:加上<list>标签即可,若集合中的值是对象,用ref引入对象即可,在通过bean指定具体的对象--><property name="list"><list><ref bean="emp1"></ref><ref bean="emp2"></ref></list></property></bean>

5.3.2 为Map集合赋值

public class Teacher {private String name;private Map<String, People> map;
<bean class="com.itgyl.beandi.People" id="people1"><property name="name" value="张三"></property><property name="age" value="18"></property></bean><bean class="com.itgyl.beandi.People" id="people2"><property name="name" value="李四"></property><property name="age" value="19"></property></bean><!--配置带有map的bean--><bean class="com.itgyl.beandi.Teacher" id="teacher"><property name="name" value="仓老师"></property><!--注入map数据需要用到<map>标签,在map标签中注入具体键值对用<entry>标签--><property name="map"><map><entry key="仓老师" value-ref="people1"></entry><entry key="三上老师" value-ref="people2"></entry></map></property></bean>

5.3.3 引用集合赋值

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:util="http://www.springframework.org/schema/util"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/utilhttp://www.springframework.org/schema/util/spring-util.xsdhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--通过util:list可直接为集合注入值--><util:list id="list"><ref bean="emp1"></ref><ref bean="emp2"></ref></util:list><!--通过util:map可直接为集合注入值--><util:map id="map"><entry key="仓老师" value-ref="emp1"></entry><entry key="三上老师" value-ref="emp2"></entry></util:map><bean class="com.itgyl.beandi.ListMap" id="listMap"><!--上面已经定义了集合list和map此时通过引入直接将集合的属性值注入到该bean中,即完成集合属性注入--><property name="list" ref="list"></property><property name="map" ref="map"></property></bean>

6. 命名空间

<!--
引入命名空间,即在xmls:名称="http://www.springframework.org/schema/名称"
可直接通过命名空间直接为bean注入属性值
-->
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean class="com.itgyl.beandi.Emp" id="emp1" p:empName="zhangsan" p:id="10096"></bean><bean class="com.itgyl.beandi.Emp" id="emp2" p:empName="lisi" p:id="10011"></bean>
</beans>

7. 引入外部文件

通过location进行引入外部文件 

配置引入文件

jdbc.user=root
jdbc.password=123456
jdbc.url=jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC
jdbc.driver=com.mysql.cj.jdbc.Driver
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!--引入外部文件--><context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder><bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource"><property name="url" value="${jdbc.url}"/><property name="driverClassName" value="${jdbc.driver}"/><property name="username" value="${jdbc.user}"/><property name="password" value="${jdbc.password}"/></bean>
</beans>

8. bean的作用域

bean的作用域:
默认使用singleton,即在该IoC容器中该bean始终为单实例化,执行时机为IoC容器创建时
prototype,即在该IoC容器中有多个实例,执行时机为获取bean时
可通过scope进行配置
<bean class="com.itgyl.beandi.User" id="user" scope="singleton"init-method="initMethod" destroy-method="destroyMethod"></bean>

 9. bean的生命周期

<!--bean的生命周期:IoC容器关闭之前有效,bean的实例化默认是单实列singleton-->
<!--bean初始化的步骤
1.通过无参构造创建实例化对象
2.给bean设置属性值
3.bean调用后置处理器之前:调用初始化方法之前
4.调用intiMethod初始化方法
5.bean调用后置处理器之后:调用初始化方法之后
6.完成bean的实例化
7.bean调用destroyMethod销毁方法
8.IoC容器关闭-->
public class User implements BeanPostProcessor{private String name;private String password;private void destroyMethod() {System.out.println("7 bean实列销毁");}private void initMethod() {System.out.println("4 bean实列初始化");}public User() {System.out.println("1 bean通过无参构造进行初始化");}
public class myBeanProcess implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("3 bean后置处理器执行之前");System.out.println("☆☆☆" + beanName + " = " + bean);return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("5 bean后置处理器执行之后");System.out.println("★★★" + beanName + " = " + bean);return bean;}
}
<bean class="com.itgyl.beandi.User" id="user" scope="singleton"init-method="initMethod" destroy-method="destroyMethod"></bean><!--后置处理器不是对单独一个bean有效,对IoC容器所有的bean都生效--><bean class="com.itgyl.beandi.myBeanProcess" id="myBeanProcess"></bean>

最终执行结果为1、2、3、4、5、6、7、8的打印语句

10. 基于XML自动装配 

 加入autowire配置

autowire=”byType"即通过类型自动装配

autowire="byName"即通过变量名进行自动装配,此时变量名为什么id名也必须保持一致

public class UserController {private UserService userService;public void setUserServiceImp(UserServiceImp userServiceImp) {this.userService = userServiceImp;}public void show() {userService.show();}
}
public class UserServiceImp implements UserService{private UserDaoImp userDaoImp;public void setUserDaoImp(UserDaoImp userDaoImp) {this.userDaoImp = userDaoImp;}@Overridepublic void show() {userDaoImp.show();}
}
public class UserDaoImp implements UserDao{@Overridepublic void show() {System.out.println("自动装配实现");}
}
<?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"><!--autowire自动装配根据类型自动进行属性注入--><bean id="userController" class="com.itgyl.auto.controller.UserController" autowire="byType"></bean><bean id="userServiceImp" class="com.itgyl.auto.service.UserServiceImp" autowire="byType"></bean><bean id="userDaoImp" class="com.itgyl.auto.dao.UserDaoImp" autowire="byType"></bean></beans>
@Testpublic void testAuto() {//通过xml文件获取管理对象的IoC容器ApplicationContext context =new ClassPathXmlApplicationContext("auto.xml");UserController userController = context.getBean("userController", UserController.class);userController.show();}

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

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

相关文章

SpringCloud配置文件bootstrap不生效

解决方案&#xff1a; 情况一、SpringBoot 版本 小于 2.4.0 版本&#xff0c;添加以下依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-context</artifactId> </dependency> 情况二、SpringBoot…

乡村振兴的乡村公共服务提升:提升乡村公共服务水平,满足农民多样化需求,构建幸福美好的美丽乡村

目录 一、引言 二、乡村公共服务提升的必要性 &#xff08;一&#xff09;满足农民多样化需求 &#xff08;二&#xff09;促进乡村经济发展 &#xff08;三&#xff09;构建幸福美好的美丽乡村 三、乡村公共服务面临的挑战 &#xff08;一&#xff09;基础设施薄弱 &a…

粘土滤镜特效怎么弄?5个简易制作粘土软件一学就会

#是谁把夏天的氛围感拿捏了#&#xff0c;哦~原来是AI粘土特效。 这玩意儿最近在社交媒体上可是火得一塌糊涂&#xff0c;大家都在用它给自己的照片来个大变身&#xff0c;变成那种丑萌丑萌的粘土小人儿。 如果大家也想尝试一下&#xff0c;那就跟着我来看看几款超好用的粘土滤…

java处理中文脱敏

方法一&#xff0c;简单的&#xff0c;不计算文字长度去设置脱敏 public static String dataDesensitization1(String content){String regex "(.{2}).*(.{2})";return ReUtil.replaceAll(content, regex, matcher -> {try {if (CharSequenceUtil.isBlank(match…

基于Django框架的项目搭建后台首页

(1). 创建数据库 osdb 进入MySQL数据库中&#xff0c;创建一个数据库名为&#xff1a;osdb 通过数据表结构来创建数据表&#xff1a; -- 员工信息表 CREATE TABLE user (id int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 员工账号id,username varchar(50) DEFAULT NULL C…

MySQL:图文超详细教程MySQL5.7下载与安装

一、前言 MySQL 5.7 是一个重要的数据库管理系统版本&#xff0c;它带来了多项改进和新特性&#xff0c;本文将超详细的带大家手动安装一下MySQL5.7。 二、下载MySQL5.7版本 MySQL5.7安装包 链接&#xff1a;https://pan.baidu.com/s/1lz5rp9PwfyeHzkEfI_lW6A 提取码&#…

图卷积神经网络的简史 及其与卷积神经网络的异同

图卷积神经网络&#xff08;GCN&#xff09;已经在处理图结构数据方面取得了巨大的成功。在本小节中&#xff0c;我们将深入探讨图卷积神经网络的起源、发展历程&#xff0c;并提供一个简单的Python代码实现示例&#xff0c;以帮助读者更好地理解这一概念。 图卷积神经网络的简…

Kubernetes 文档 / 概念 / 服务、负载均衡和联网

Kubernetes 文档 / 概念 / 服务、负载均衡和联网 此文档从 Kubernetes 官网摘录 中文地址 英文地址 Kubernetes 网络模型 集群中每一个 Pod 都会获得自己的、 独一无二的 IP 地址&#xff0c; 这就意味着你不需要显式地在 Pod 之间创建链接&#xff0c;你几乎不需要处理容器…

Django 请求方式

在 Django 中要想知道请求方式&#xff0c;可以在views.py文件里获知。views.py 是在自己创建的app文件夹里的 from django.shortcuts import redirectdef login(request):# 获取请求方式 GET/POSTprint(request.method)# 获取url中的参数&#xff1a;/login/?n1123&n2…

深入理解 Docker:概念、原理与操作指南

推荐一个AI网站&#xff0c;免费使用豆包AI模型&#xff0c;快去白嫖&#x1f449;海鲸AI Docker 简介、原理及操作 Docker 是一个开源的容器化平台&#xff0c;它可以将应用程序及其依赖项打包到一个可移植的容器中&#xff0c;从而实现应用程序的快速部署、运行和管理。本文…

c# 贪心算法(Greedy Algo)

贪婪是一种算法范式&#xff0c;它逐步构建解决方案&#xff0c;始终选择提供最明显和直接收益的下一个部分。贪婪算法用于解决优化问题。 如果问题具有以下属性&#xff0c;则可以使用贪心法解决优化问题&#xff1a; 每一步&#xff0c;我们都可以做出当前看来最好的选择&…

IDEA 2024.1安装与破解

一、下载 官网地址&#xff1a;https://www.jetbrains.com/idea/download/other.html 二、安装 傻瓜式安装即可 三、破解 3.1 破解程序 网站&#xff1a;https://3.jetbra.in/ 3.2 获取激活码 点击*号部分即可复制成功

python纸牌塔游戏

下面是一个简单的Python实现的纸牌塔游戏的示例代码。这个游戏是基于简单的图形用户界面和命令行界面。 import random import sys import time # 定义游戏中的卡片数量 CARD_COUNT 52 # 定义游戏中的牌堆数量 DECK_COUNT 4 # 定义游戏中的卡片等级 RANKS [A, 2, 3…

Vue——开发前的准备和创建一个vue的工程

文章目录 前言安装 Node js1、下载node.js2、安装node.js3、查看是否安装成功 创建 vue 工程Visual Studio Code 配置目录结构 前言 本篇博客主要讲解Vue开发前的环境配置与一些说明。 安装 Node js 环境需要安装配置一个nodejs 的环境。 vue3 最低nodejs 版本要求为 15.0 1…

[图解]产品经理创新模式01物流变成信息流

1 00:00:01,570 --> 00:00:04,120 有了现状的业务序列图 2 00:00:04,960 --> 00:00:08,490 我们就来改进我们的业务序列图了 3 00:00:08,580 --> 00:00:11,010 把我们要做的系统放进去&#xff0c;改进它 4 00:00:13,470 --> 00:00:15,260 怎么改进&#xff1f;…

揭秘OS模块:文件与文件夹的遍历艺术

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、os.listdir()&#xff1a;当前目录的扫描者 三、os.walk()&#xff1a;文件系…

揭秘!EasyRecovery如何轻松救回你的误删文件?

在数字化的今天&#xff0c;数据就像我们生活和工作的血液&#xff0c;流淌在每一个角落。无论是珍贵的家庭照片&#xff0c;还是关键的工作文件&#xff0c;都离不开数据的支撑。然而&#xff0c;数据丢失的情况时有发生&#xff0c;这可能是由于一次误删&#xff0c;一个系统…

PCL 二维凸包切片法计算树冠体积

目录 一、算法原理1、原理概述2、参考文献二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 1、原理概述 二维凸包法是先将树冠等间隔分层切片,如图(e)采用二维凸包算法对每层…

FullCalendar日历组件集成实战(7)

背景 有一些应用系统或应用功能&#xff0c;如日程管理、任务管理需要使用到日历组件。虽然Element Plus也提供了日历组件&#xff0c;但功能比较简单&#xff0c;用来做数据展现勉强可用。但如果需要进行复杂的数据展示&#xff0c;以及互动操作如通过点击添加事件&#xff0…

Springboot 开发 -- 序列化与消息转换器

一、序列化与反序列化 1、认识序列化与反序列化 Java序列化是指把Java对象转换为字节序列的过程&#xff0c;而Java反序列化是指把字节序列恢复为Java对象的过程。 2、为什么要实现对象的序列化和反序列化&#xff1f; &#xff08;1&#xff09;我们创建的Java对象被存储在…