Spring 基于XML配置 bean管理 Bean-IOC的方法

2025-04-21 17:50

本文主要是介绍Spring 基于XML配置 bean管理 Bean-IOC的方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Spring基于XML配置bean管理Bean-IOC的方法》:本文主要介绍Spring基于XML配置bean管理Bean-IOC的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一...

一. spring学习的核心内容

  • Spring 核心学习内容 IOC、AOP, jdbcTemplate, 声明式事务
  • IOC: 控制反转 , 可以管理 Java 对象
  • AOP : 切面编程
  • JDBCTemplate : 是 spring 提供一套访问数据库的技术, 应用性强,相对好理解
  • 声明式事务: 基于 ioc/aop 实现事务管理,

Spring 基于XML配置 bean管理 Bean-IOC的方法

Spring 几个重要概念

Spring 可以整合其他的框架(解读: Spring 是管理框架的框架)
Spring 有两个核心的概念: IOC 和 AOP
IOC [Inversion Of Control 反转控制]

2.为什么学习spring,我们看一下传统的开发模式

Spring 基于XML配置 bean管理 Bean-IOC的方法

上图连接到数据库为例说明

程序员编写程序, 在程序中读取配置信息
创建对象, new Object???() // 反射方式
使用对象完成任务

而IOC 的开发模式 [EmpAction EmpService EmpDao Emp]程序<-----容器

Spring 基于XML配置 bean管理 Bean-IOC的方法

解读上图
1.Spring 根据配置文件 xml/注解, 创建对象, 并放入到容器(ConcurrentHashMap)中,并且可以完成对象之间的依赖
2.当需要使用某个对象实例的时候, 就直接从容器中获取即可
3.程序员可以更加关注如何使用对象完成相应的业务, (以前是 new … ==> 注解/配置方式)
4.DI—Dependency Injection 依赖注入,可以理解成是 IOC 的另外叫法.
5.Spring 最大的价值,通过配置,给程序提供需要使用的web 层[Servlet(Action/Controller)]/Service/Dao/[JavaBean/entity]对象,这个是核心价值所在,也是 ioc 的具体体现, 实现解耦.

3.Debug 看一下 Spring 容器的处理机制,

Spring 基于XML配置 bean管理 Bean-IOC的方法

Spring 基于XML配置 bean管理 Bean-IOC的方法

Spring 基于XML配置 bean管理 Bean-IOC的方法

Spring 基于XML配置 bean管理 Bean-IOC的方法

Spring 基于XML配置 bean管理 Bean-IOC的方法

Spring 基于XML配置 bean管理 Bean-IOC的方法

Spring管理 Bean-IOC

Bean管理包括两方面,创建 bean 对象和给 bean 注入属性,Bean 配置方式也有两种,基于 xml 文件配置方式和基于注解方式

二. 基于 XML 配置 bean

1. 通过类型来获取 bean

通过 spring 的 ioc 容器, 获取一个 bean 对象

创建 Monster.java在 beans.xml 配置(说明前面已经配置好了)

解读:
1. 配置monster对象/javabean
2. 在beans中可以配置多个bean
3. bean表示就是一个java对象
4. class属性是用于指定类的全路径->spring底层使用反射创建
5. id属性表示该java对象在spring容器中的id, 通过id可以获取到对象
6. 用于给该对象的属性赋值

<bean id="monster01" class="com.hspedu.spring.beans.Monster">
<property name="monsterId" value="1"/>
<property name="name" value="牛魔王"/>
<property name="skill" value="牛魔王拳"/>
</bean>

完成测试

ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
Monster monster = ioc.getBean(Monster.class);

细节说明

按类型来获取 bean, 要求 ioc 容器中的同一个类的 bean 只能有一个, 否则会抛出异常
NoUniqueBeanDefinitionException

Spring 基于XML配置 bean管理 Bean-IOC的方法

这种方式的应用场景:比如 XxxAction/Servlet/Controller, 或 XxxService 在一个线程
中只需要一个对象实例(单例)的情况说明一下: 在容器配置文件(比如 beans.xml)中给属性赋值, 底层是通过
setter 方法完成的, 这也是为什么我们需要提供 setter 方法的原因

2. 通过构造器配置 bean

在 spring 的 ioc 容器, 可以通过构造器来配置 bean 对象

解读
1. constructor-arg标签可以指定使用构造器的参数
2. index表示构造器的第几个参数 从0开始计算的
3. 除了可以通过index 还可以通过 name / type 来指定参数方式
4. 解除大家的疑惑, 类的构造器,不能有完全相同类型和顺序的构造器,所以可以通过type来指定

<bean id="monster02" class="com.hspedu.spring.beans.Monster">
<constructor-arg value="2" index="0"/>
<constructor-arg value="蜘蛛精" index="1"/>
<constructor-arg value="吐口水" index="2"/>
</bean>

数据类型就是对应的 Java 数据类型,按构造器参数顺序

<bean id="monster03" class="com.hspedu.spring.beans.Monster">
<constructor-arg value="3" type="java.lang.Integer"/>
<constructor-arg value="白骨精" type="java.lang.String"/>
<constructor-arg value="白骨鞭" type="java.lang.String"/>
</bean>

完成测试

ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
Object monster02 = ioc.getBean("monster02");
Object monster03 = ioc.getBean("monster03");

通过 index 属性来区分是第几个参数
通过 type 属性来区分是什么类型(按照顺序)

3. 通过 p 名称空间配置 bean

在 spring 的 ioc 容器, 可以通过 p 名称空间来配置 bean 对象
完成步骤

在 beans.xml 配置, 增加命名空间配置xmlns:p="http://www.springframework.org/schema/p"

1.将光标放在p , 输入alt+enter , 就会自动的添加xmlns
2.有时需要多来几次

<bean id="monster04" class="com.hspedu.spring.beans.Monster"> 
p:monsterId="4" p:name="红孩儿"
p:skill="吐火~"
/>

完成测试

ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
Monster monster04 = ioc.getBean("monster04", Monster.class);

4. 引用/注入其它 bean 对象

在 spring 的 ioc 容器, 可以通过 ref 来实现 bean 对象的相互www.chinasem.cn引用

其它含义和前面一样ref 表示 memberDAO 这个属性将引用/指向 id = memberDAOImpl 对象

解读
1.ref="memberDAO"表示 MemberServiceImpl对象属性memberDAO引用的对象是id=memberDAO 的对象
2.这里就体现出spring容器的依赖注入
3.注意再spring容器中, 他是作为一个整体来执行的, 即如果你引用到一个bean对象, 对你配置的顺序没有要求
4.建议还是按顺序,好处是阅读的时候,比较方便

<bean id="memberServiceImpl" class="com.hspedu.spring.service.MemberServiceImpl">
<property name="memberDAO" ref="memberDAOImpl"/>
</bean>
<bean id="memberDAOImpl" class="com.hspedu.spring.dao.MemberDAOImpl"/>

5. 引用/注入内部 bean 对象

<bean id="memberServiceImpl02" class="com.hspedu.spring.service.MemberServiceImpl">
<property name="memberDAO">
	<bean class="com.hspedu.spring.dao.MemberDAOImpl"/>
</property>
</bean>

6. 引用/注入集合/数组类型

给 bean 对象的 list 集合赋值

<bean id="master01" class="com.hspedu.spring.beans.Master">
<property name="name" value="太上老君"/>
<property name="monsterList">
<list>
<ref bean="monster03"/>
<ref bean="monster02"/>
</list>
</property>

给 bean 对象的 map 集合赋值

<property name="monsterMap">
<map>
<entry>
<key>
<value>monsterKey01</value>
</key>
<ref bean="monster01"/>
</entry>
<entry>
<key>
<value>monsterKey02</value>
</key>
<ref bean="monster02"/>
</entry>
</map>
</property>

给 bean 对象的 properties 集合赋值 结构k(String)-v(String)

<property name="pros">
<props>
<prop key="k1">Java 工程师</prop>
<prop key="k2">前端工程师qJcYRHc</prop>
<prop key="k3">大数据工程师</prop>
</props>
</property>

给 bean 对象的数组属性注入值 ,array标签中使用 value 还是 bean , ref … 要根据你的业务决定

<property name="monsterName">
<array>
<value>银角大王</value>
<value>金角大王</value>
</array>
</property>

给 bean 对象的 set 属性注入值

<property name="monsterSet">
<set>
<ref bean="monster01"/>
<bean class="com.hspedu.spring.beans.Monster">
<property name="monsterId" value="10"/>
<property name="name" value="玉兔精"/>
<property name="skill" value="钻地洞"/>
</bean>
</set>
</property>
</bean>

1.主要掌握 List/Map/Properties 三种集合的使用.
2.Properties 集合的特点

1)这个 Properties 是 Hashtable 的子类 , 是 key-value 的形式
2)key 是 string 而 value 也是 string

7. 级联属性赋值

spring 的 ioc 容器, 可以直接给对象属性的属性赋值, 即级联属性赋值

<bean id="emp" class="com.hspedu.spring.beans.Emp">
<property name="name" value="jack"/>
<property name="dept" ref="dept"/>
<property name="dept.name" value="Java 开发部"/>
</bean>
<bean id="dept" class="com.hspedu.spring.beans.Dept"/>

8. 通过静态工厂获取对象

先创建一个静态工厂

public class MyStaticFactory {
private static Map<String, Monster> monsterMap;
static {
monsterMap = new HashMap<String, Monster>();
monsterMap.put("monster_01", new Monster(100, "黄袍怪", "一阳指"));
monsterMap.put("monster_02", new Monster(200, "九头金雕", "如来神掌"));
}
public static Monster getMonster(String key) {
return monsterMap.get(key);
}
}

修改 beans.xml , 增加配置

1 通过静态工厂获取/配置bean
2. class 是静态工厂类的全路径
3. factory-method 表示是指定静态工厂类的哪个方法返回对象
4. constructor-arg value=“monster02” value是指定要返回静态工厂的哪个对象

<!-- 通过静态工厂来获取 bean 对象 -->
<bean id="my_monster" class="com.hspedu.spring.factory.MyStaticFactory"
factory-method="getMonster">
<!-- constructor-arg 标签提供 key -->
<constructor-arg value="monster_01"/>
</bean>

通过这个静态工厂获取的对象是同一个

9. 通过实例工厂获取对象

在 spring 的 ioc 容器, 可以通过实例工厂获取 bean 对象

public class MyInstanceFactory {
private Map<String, Monster> monster_map;
//非静态代码块
{
monster_map = new HashMap&androidlt;String, Monster>();
monster_map.put("monster_01", new Monster(100, "猴子精", "吃人"));
monster_map.put("monster_02", new Monster(200, "九头金雕", "如来神掌"));
}
public Monster getMonster(String key) {
return monster_map.get(key);
}
}

配置 beans.xm

1.factory-bean 指定使用哪个实例工厂对象返回bean
2. factory-method 指定使用实例工厂对象的哪个方法返回bean
3. constructor-arg value=“monster03” 指定获取到实例工厂中的哪个monster

<bean id="myInstanceFactory" class="com.hspedu.spring.factory.MyInstanceFactory"/>
<bean id="my_monster2" factory-bean="myInstanceFactory"
factory-method="getMonster">
<constructor-arg value="monster_02"/>
</bean>

通过这个实例工厂获取的对象是同一个,如果创建两次实例工厂,再分别获取对象就不是同一个,这是和静态工厂的区别。

10. 通过 FactoryBean 获取对象(重点)

public class MyFactoryBean implements FactoryBean<Monster> {
private String keyVal;
private Map<String, Monster> monster_map;
{
monster_map = new HashMap<String, Monster>();
monster_map.put("monster_01", new Monster(100, "黄袍怪", "一阳指"));
monster_map.put("monster_02", new Monster(200, "九头金雕", "如来神掌"));
}
public javascriptvoid setKeyVal(String keyVal) {
this.keyVal = keyVal;
}
@Override
public Monster getObject() throws Exception {
// TODO Auto-generated method stub
return this.monster_map.get(keyVal);
}
@Override
public Class getObjectType() {
// TODO Auto-generated method stub
return Monster.class;
}
@Override
public boolean isSingleton() {
// TODO Auto-generated method stub
return true;
}
}

解读
1.通过 FactoryBean 来获取 bean 对象
2.name=“keyVal” 就是 MyFactoryBean 定义的 setKeyVal 方法
3.value=“monster_01” ,就是给 keyVal 的值

<bean id="myFactoryBean" class="com.hspedu.spring.factory.MyFactoryBean">
<property name="keyVal" value="monster_01"/>
</bean>

11. bean 配置信息重用(继承)

在 spring 的 ioc 容器, 提供了一种继承的方式来实现 bean 配置信息的重用

<!-- 继承的方式来实现 bean 配置信息的重用 -->
<bean id="monster10" class="com.hspedu.spring.beans.Monster">
<property name="monsterId" value="10"/>
<property name="name" value="蜈蚣精"/>
<property name="skill" value="蜇人"/>
</bean>
<!-- parent="monster10" 就是继承使用了 monster10 的配置信息 -->
<bean id="monster11" class="com.hspedu.spring.beans.Monster" parent="monster10"/>
<!-- 当我们把某个bean设置为 abstract="true" 这个bean只能被继承,而不能实例化了 -->
<bean id="monster12" class="com.hspedu.spring.beans.Monster" abstract="true">
<property name="monsterId" value="12"/>
<property name="name" value="美女蛇"/>
<property name="skill" value="吃人"/>
</bean>
<!-- parent="monster12" 就是继承使用了 monster12 的配置信息 -->
<bean id="monster13" class="com.hspedu.spring.beans.Monster" parent="monster12"/>

到此这篇关于Spring 基于XML配置 bean管理 Bean-IOC的方法的文章就介绍到这了,更多相关Spring 管理 Bean-IOC内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于Spring 基于XML配置 bean管理 Bean-IOC的方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1154308

相关文章

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Spring Boot 集成 Quartz并使用Cron 表达式实现定时任务

《SpringBoot集成Quartz并使用Cron表达式实现定时任务》本篇文章介绍了如何在SpringBoot中集成Quartz进行定时任务调度,并通过Cron表达式控制任务... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Sprin

springboot上传zip包并解压至服务器nginx目录方式

《springboot上传zip包并解压至服务器nginx目录方式》:本文主要介绍springboot上传zip包并解压至服务器nginx目录方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录springboot上传zip包并解压至服务器nginx目录1.首先需要引入zip相关jar包2.然

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

将Java项目提交到云服务器的流程步骤

《将Java项目提交到云服务器的流程步骤》所谓将项目提交到云服务器即将你的项目打成一个jar包然后提交到云服务器即可,因此我们需要准备服务器环境为:Linux+JDK+MariDB(MySQL)+Gi... 目录1. 安装 jdk1.1 查看 jdk 版本1.2 下载 jdk2. 安装 mariadb(my

基于Python实现读取嵌套压缩包下文件的方法

《基于Python实现读取嵌套压缩包下文件的方法》工作中遇到的问题,需要用Python实现嵌套压缩包下文件读取,本文给大家介绍了详细的解决方法,并有相关的代码示例供大家参考,需要的朋友可以参考下... 目录思路完整代码代码优化思路打开外层zip压缩包并遍历文件:使用with zipfile.ZipFil

如何使用Nginx配置将80端口重定向到443端口

《如何使用Nginx配置将80端口重定向到443端口》这篇文章主要为大家详细介绍了如何将Nginx配置为将HTTP(80端口)请求重定向到HTTPS(443端口),文中的示例代码讲解详细,有需要的小伙... 目录1. 创建或编辑Nginx配置文件2. 配置HTTP重定向到HTTPS3. 配置HTTPS服务器

Python处理函数调用超时的四种方法

《Python处理函数调用超时的四种方法》在实际开发过程中,我们可能会遇到一些场景,需要对函数的执行时间进行限制,例如,当一个函数执行时间过长时,可能会导致程序卡顿、资源占用过高,因此,在某些情况下,... 目录前言func-timeout1. 安装 func-timeout2. 基本用法自定义进程subp

SpringBoot中配置Redis连接池的完整指南

《SpringBoot中配置Redis连接池的完整指南》这篇文章主要为大家详细介绍了SpringBoot中配置Redis连接池的完整指南,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以... 目录一、添加依赖二、配置 Redis 连接池三、测试 Redis 操作四、完整示例代码(一)pom.