Bean 的装配可以理解为依赖关系注入,Bean 的装配方式也就是 Bean 的依赖注入方式。Spring 容器支持多种形式的 Bean 的装配方式,如基于 XML 的 Bean 装配、基于 Annotation 的 Bean 装配和自动装配等。

Spring 基于 XML 的装配通常采用两种实现方式,即设值注入(Setter Injection)和构造注入(Constructor Injection)。

在 Spring 实例化 Bean 的过程中,首先会调用默认的构造方法实例化 Bean 对象,然后通过 Java 的反射机制调用 setXxx() 方法进行属性的注入。因此,设值注入要求一个 Bean 的对应类必须满足以下两点要求。

 必须提供一个默认的无参构造方法。必须为需要注入的属性提供对应的 setter 方法。

使用设值注入时,在 Spring 配置文件中,需要使用 元素的子元素 元素为每个属性注入值。而使用构造注入时,在配置文件中,主要使用 标签定义构造方法的参数,可以使用其 value 属性(或子元素)设置该参数的值。
示例基于 XML 方式的 Bean 的装配。
1. 创建 Person 类
在项目 spring中的 src 目录下,创建一个名称为 com.zsh 的包,在该包下创建一个 Person 类,如下所示。

package com.zsh;public class Person {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}// 重写toString()方法public String toString() {return "Person[name=" + name + ",age=" + age + "]";}// 默认无参的构造方法public Person() {super();}// 有参的构造方法public Person(String name, int age) {super();this.name = name;this.age = age;}
}

上述代码中,定义了 name 和 age 两个属性,并为其提供了 getter 和 setter 方法,由于要使用构造注入,所以需要提供有参的构造方法。为了能更清楚地看到输出结果,这里还重写了 toString() 方法。

2. 创建 Spring 配置文件
在 com.zsh 包下创建一个名为 applicationContext.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" xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.2.xsd"><!-- 使用设值注入方式装配Person实例 --><bean id="person1" class="zsh.Person"><property name="name" value="zhangsan" /><property name="age" value="20" /></bean><!-- 使用构造方法装配Person实例 --><bean id="person2" class="com.zsh.Person"><constructor-arg index="0" value="lisi" /><constructor-arg index="1" value="21" /></bean>
</beans>

上述代码中,首先使用了设值注入方式装配 Person 类的实例,其中 子元素用于调用 Bean 实例中的 setXxx() 方法完成属性赋值。然后使用了构造方式装配了 Person 类的实例,其中 元素用于定义构造方法的参数,其属性 index 表示其索引(从 0 开始),value 属性用于设置注入的值。

3. 创建测试类
在 com.zsh包下创建一个名称为 XmlBeanAssemblyTest 的测试类,编辑后如下所示。

package com.zsh;import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class XmlBeanAssemblyTest {@Testpublic void test() {// 定义Spring配置文件路径String xmlPath = "com/zsh/applicationContext.xml";// 初始化Spring容器,加载配置文件,并对bean进行实例化ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);// 设值方式输出结果System.out.println(applicationContext.getBean("person1"));// 构造方式输出结果System.out.println(applicationContext.getBean("person2"));}
}

上述代码中,分别获取并输出了 id 为 person1 和 person2 的实例。
4. 运行项目并查看结果
使用 JUnit 测试运行 test() 方法,运行成功后,控制台的输出结果如下图所示。

从输出结果中可以看出,使用设值注入和构造注入两种方式都成功装配了 Person 实例。

Spring基于XML装配Bean相关推荐

  1. Spring基于Annotation装配Bean

    在 Spring 中,尽管使用 XML 配置文件可以实现 Bean 的装配工作,但如果应用中 Bean 的数量较多,会导致 XML 配置文件过于臃肿,从而给维护和升级带来一定的困难. Java 从 J ...

  2. Spring : spring基于xml配置Bean

    1.美图 2.案例 2.1 项目结构 2.2 user类 package com.spring.bean;import java.util.List;

  3. Spring基础——在 Spring Config 文件中基于 XML 的 Bean 的自动装配

    一.Spring IOC 容器支持自动装配 Bean,所谓自动装配是指,不需要通过 <property> 或 <constructor-arg> 为 Bean 的属性注入值的过 ...

  4. Spring Ioc容器,基于xml的bean管理

    IOC容器 IOC思想基于IOC容器,IOC容器底层就是对象工厂 IOC底层 通过控制反转,使用xml配置文件和反射机制实现对对象的创建 IOC接口 实现IOC容器的两种方式 (1)BeanFacto ...

  5. Spring-IOC—基于XML配置Bean

    Spring-IOC-基于XML配置Bean 1.Spring 配置/管理 bean 介绍 1.Bean 管理包括两方面 1.创建bean对象 2.给bean注入属性 2.Bean配置方式 1.基于x ...

  6. 3、基于XML管理bean

    文章目录 3.基于XML管理bean 实验一:入门案例 实验二:获取bean 实验三:依赖注入之setter注入 实验四:依赖注入之构造器注入 实验五:特殊值处理 实验六:为类类型属性赋值 实验七:为 ...

  7. spring 基于XML的申明式AspectJ通知的执行顺序

    spring 基于XML的申明式AspectJ通知的执行顺序 关于各种通知的执行顺序,结论:与配置文件中的申明顺序有关 1. XML文件配置说明 图片来源:<Java EE企业级应用开发教程&g ...

  8. Spring 基于Java的Bean声明

    Spring 基于Java的Bean声明 使用@Configuration进行设置: Xml: <?xml version="1.0" encoding="UTF- ...

  9. Spring基于xml自动装配

    基于xml自动装配 手动装配 自动装配 首先写两个类Dept类和Emp类. Dept类: package com.Keafmd.spring5.autowire;/*** Keafmd** @Clas ...

最新文章

  1. 【汇总】细数VSCode中那些能够真正意义提升开发效率、鲜为人知的快捷键
  2. aligned_storage简单学习
  3. GPT-3:被捧上天的流量巨星,却有重大缺陷,很危险...
  4. 服务器选哪个系统,服务器选择哪个操作系统
  5. LeetCode Rotate Image(矩阵的旋转)
  6. 为什么添加Web引用后,客户端就能远程调用WebService了?
  7. 2021-01-27 计算机-进程与线程区别
  8. iOS 动画总结----UIView动画
  9. 第22天学习Java的笔记-继承
  10. Druid SQL查询数据timeStamp时区问题
  11. 打破云原生时代存储瓶颈,SmartX 发布 K8s 云原生存储 IOMesh
  12. python 类继承和组合_python类与对象的组合与继承
  13. 20个MySQL运维案例,请查收!
  14. Oracle索引扫描方式
  15. 百度北汽结盟:2021年量产L4级无人车
  16. linux中根据进程的PID值来查找执行文件的及其路径
  17. HDU 3651 A Simple Problem
  18. linux下如何创建oracle数据库实例,Linux下新建Oracle数据库实例
  19. 外汇EA量化真的可以赚钱吗?还是新型骗局?
  20. hdu3594-仙人掌图的判断tarjan找环-Cactus

热门文章

  1. code block怎样实现图形界面_微服务入门:Openresty实现API网关
  2. 完全相同的4个小矩形如图所示放置_分享 | 你想知道的100个桥梁知识点!
  3. java 树状 子节点_java构建树形列表(带children属性)
  4. Outlook2016怎么修改默认数据库
  5. 最新系统之家系统win11 32位官方版v2021.07
  6. Android投屏(屏幕共享)设计需要考虑的关键因素
  7. MySQL如何有效的存储IP地址
  8. MySql 清空、删除、截断表时1701错误
  9. C语言中输入123求位权,数反转 - it610.com
  10. 预测回归_回归分析预测技术简介