spring IOC容器的Bean管理XML自动装配过程


Posted in Java/Android onMay 30, 2022

什么是自动装配?

在之前的内容中,每给属性注入值都要一个个的用 property 标签来完成,比如:

<bean id="book" class="com.pingguo.spring5.collectiontype.Book" scope="prototype">
        <property name="list" ref="bookList"></property>
    </bean>

这就是手动装配。

而自动装配中,spring 会根据指定装配规则(属性名称或者属性类型) 来自动的将匹配的属性值进行注入。

自动装配过程

1. 创建 2 个类

分别是部门类 Department 和员工类 Employee 。

package com.pingguo.spring5.autowire;
public class Department {
    @Override
    public String toString() {
        return "Department{}";
    }
}

员工类有个 部门的属性,表示员工所属的一个部门。其他方法是为了后续方便演示输出。

package com.pingguo.spring5.autowire;
public class Employee {
    private Department department;
    public void setDepartment(Department department) {
        this.department = department;
    }
    @Override
    public String toString() {
        return "Employee{" +
                "department=" + department +
                '}';
    }
    public void test() {
        System.out.println(department);
    }
}

2. 配置文件

<?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="employee" class="com.pingguo.spring5.autowire.Employee">
        <property name="department" ref="department"></property>
    </bean>
    <bean id="department" class="com.pingguo.spring5.autowire.Department"></bean>
</beans>

3. 测试方法

@Test
    public void test5() {
        ApplicationContext context =
                new ClassPathXmlApplicationContext("bean5.xml");
        Employee employee = context.getBean("employee", Employee.class);
        System.out.println(employee);
    }

运行结果:

Employee{department=Department{}}
Process finished with exit code 0

ok,到这里,其实就是手动装配的过程。

实现自动装配,在配置文件里,通过 bean 标签里的属性 autowire 来配置:

  • autowire="byName":根据属性名称自动注入。
  • autowire="byType":根据属性类型自动注入。

1)byName 演示

注入值的bean的 id 值和类属性名称一致,比如:

spring IOC容器的Bean管理XML自动装配过程

修改配置文件,加上 autowire="byName",然后注释掉 property。

<bean id="employee" class="com.pingguo.spring5.autowire.Employee" autowire="byName">
        <!--<property name="department" ref="department"></property>-->
    </bean>
    <bean id="department" class="com.pingguo.spring5.autowire.Department"></bean>

执行测试函数:

Employee{department=Department{}}
Process finished with exit code 0

跟使用 property 手动装配结果一致。

2)byType 演示

要注入值的 bean 的类型与 属性里的一致,比如:

spring IOC容器的Bean管理XML自动装配过程

现在继续修改配置文件,加上 autowire="byType",然后注释掉 property。

<bean id="employee" class="com.pingguo.spring5.autowire.Employee" autowire="byType">
        <!--<property name="department" ref="department"></property>-->
    </bean>
    <bean id="department" class="com.pingguo.spring5.autowire.Department"></bean>

再次执行测试:

Employee{department=Department{}}
Process finished with exit code 0

跟使用 property 手动装配结果一致。

不过,用 xml 方式使用自动装配实际中是很少的,一般是以注解的方式,后续会学习到。

以上就是spring IOC容器的Bean管理XML自动装配过程的详细内容!


Tags in this post...

Java/Android 相关文章推荐
详解Java实践之抽象工厂模式
Jun 18 Java/Android
分析设计模式之模板方法Java实现
Jun 23 Java/Android
Java中常用解析工具jackson及fastjson的使用
Jun 28 Java/Android
java基础——多线程
Jul 03 Java/Android
Springboot配置suffix指定mvc视图的后缀方法
Jul 03 Java/Android
Java中try catch处理异常示例
Dec 06 Java/Android
spring cloud eureka 服务启动失败的原因分析及解决方法
Mar 17 Java/Android
Java实现经典游戏泡泡堂的示例代码
Apr 04 Java/Android
Android studio 简单计算器的编写
May 20 Java/Android
Android Canvas绘制文字横纵向对齐
Jun 05 Java/Android
Java+swing实现抖音上的表白程序详解
Jun 25 Java/Android
详解Spring Security如何在权限中使用通配符
Jun 28 Java/Android
利用正则表达式匹配浮点型数据
May 30 #Java/Android
JavaScript正则表达式实现注册信息校验功能
May 30 #Java/Android
Java时间工具类Date的常用处理方法
May 25 #Java/Android
Java实现扫雷游戏详细代码讲解
多线程Spring通过@Scheduled实现定时任务
May 25 #Java/Android
SpringBoot全局异常处理方案分享
May 25 #Java/Android
Java数据结构之堆(优先队列)
May 20 #Java/Android
You might like
PHP4在WinXP下IIS和Apache2服务器上的安装实例
2006/10/09 PHP
PHP调用wsdl文件类型的接口代码分享
2014/11/19 PHP
php实现复制移动文件的方法
2015/07/29 PHP
PHP面向对象五大原则之开放-封闭原则(OCP)详解
2018/04/04 PHP
在网页里看flash的trace数据的js类
2009/01/10 Javascript
判断javascript的数据类型(示例代码)
2013/12/11 Javascript
jQuery数据缓存用法分析
2015/02/20 Javascript
jquery的父、子、兄弟节点查找,节点的子节点循环方法
2016/12/07 Javascript
防止重复发送 Ajax 请求
2017/02/15 Javascript
原生js仿浏览器滚动条效果
2017/03/02 Javascript
React Native使用fetch实现图片上传的示例代码
2018/03/07 Javascript
vue实现微信分享链接添加动态参数的方法
2019/04/29 Javascript
jQuery实现checkbox全选、反选及删除等操作的方法详解
2019/08/02 jQuery
js实现tab栏切换效果
2020/08/02 Javascript
详解React路由传参方法汇总记录
2020/11/29 Javascript
Python 基础教程之闭包的使用方法
2017/09/29 Python
Python实现上下班抢个顺风单脚本
2018/02/07 Python
python删除文本中行数标签的方法
2018/05/31 Python
Python3.5实现的罗马数字转换成整数功能示例
2019/02/25 Python
Python-ElasticSearch搜索查询的讲解
2019/02/25 Python
TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片
2019/03/14 Python
PyQt5 closeEvent关闭事件退出提示框原理解析
2020/01/08 Python
Python数据结构dict常用操作代码实例
2020/03/12 Python
Python中猜拳游戏与猜筛子游戏的实现方法
2020/09/04 Python
css3 旋转按钮 使用CSS3创建一个旋转可变色按钮
2012/12/31 HTML / CSS
Michael Kors美国官网:美式奢侈生活风格的代表
2016/11/25 全球购物
J2EE相关知识面试题
2013/08/26 面试题
英语专业推荐信
2013/11/16 职场文书
中班上学期幼儿评语
2014/04/30 职场文书
关于梦想的演讲稿
2014/05/05 职场文书
社区文艺活动方案
2014/08/19 职场文书
2014年村支部书记四风对照检查材料思想汇报
2014/10/02 职场文书
大学生党员自我剖析材料
2014/10/06 职场文书
成绩单评语
2015/01/04 职场文书
英语演讲开场白
2015/05/29 职场文书
2019年手机市场的调研报告2篇
2019/10/10 职场文书