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 22 Java/Android
简单总结SpringMVC拦截器的使用方法
Jun 28 Java/Android
Jackson 反序列化时实现大小写不敏感设置
Jun 29 Java/Android
SpringBoot整合JWT的入门指南
Jun 29 Java/Android
spring boot中nativeQuery的用法
Jul 26 Java/Android
SpringMVC 整合SSM框架详解
Aug 30 Java/Android
Mybatis是这样防止sql注入的
Dec 06 Java/Android
关于@OnetoMany关系映射的排序问题,使用注解@OrderBy
Dec 06 Java/Android
关于maven依赖 ${xxx.version}报错问题
Jan 18 Java/Android
Flutter集成高德地图并添加自定义Maker的实践
Apr 07 Java/Android
Java 超详细讲解hashCode方法
Apr 07 Java/Android
Android自定义双向滑动控件
Apr 19 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
PHP5 安装方法
2006/10/09 PHP
PHP XML数据解析代码
2010/05/26 PHP
php 传值赋值与引用赋值的区别
2010/12/29 PHP
PHP上传文件时自动分配路径的方法
2015/01/09 PHP
php+mysql实现无限分类实例详解
2015/01/15 PHP
js 蒙版进度条(结合图片)
2010/03/10 Javascript
JQuery 插件制作实践 xMarquee插件V1.0
2010/04/02 Javascript
jquery解决图片路径不存在执行替换路径
2013/02/06 Javascript
artDialog双击会关闭对话框的修改过程分享
2013/08/05 Javascript
简单实用的全选反选按钮例子
2013/10/18 Javascript
利用进制转换压缩数字函数分享
2014/01/02 Javascript
使用原生js封装webapp滑动效果(惯性滑动、滑动回弹)
2014/05/06 Javascript
使用Meteor配合Node.js编写实时聊天应用的范例
2015/06/23 Javascript
JavaScript文档碎片操作实例分析
2015/12/12 Javascript
D3.js实现文本的换行详解
2016/10/14 Javascript
nodejs的HTML分析利器node-jquery用法浅析
2016/11/08 NodeJs
使用JavaScript获取URL中的参数(两种方法)
2016/11/16 Javascript
浅谈js函数的多种定义方法与区别
2016/11/29 Javascript
详解nodejs 文本操作模块-fs模块(一)
2016/12/22 NodeJs
Bootstrap页面缩小变形的快速解决办法
2017/02/03 Javascript
Vue-CLI 3.X 部署项目至生产服务器的方法
2019/03/22 Javascript
wx-charts 微信小程序图表插件的具体使用
2019/08/18 Javascript
autojs 蚂蚁森林能量自动拾取即给指定好友浇水的实现方法
2020/05/03 Javascript
antd-日历组件,前后禁止选择,只能选中间一部分的实例
2020/10/29 Javascript
python 测试实现方法
2008/12/24 Python
《Python之禅》中对于Python编程过程中的一些建议
2015/04/03 Python
简单介绍一下pyinstaller打包以及安全性的实现
2020/06/02 Python
Pytorch实验常用代码段汇总
2020/11/19 Python
html5中localStorage本地存储的简单使用
2017/06/16 HTML / CSS
波兰珠宝品牌:YES
2019/08/09 全球购物
荣耀俄罗斯官网:HONOR俄罗斯
2020/10/31 全球购物
简历中求职的个人自我评价
2013/12/03 职场文书
咖啡书吧创业计划书
2014/01/13 职场文书
Python实战之实现康威生命游戏
2021/04/26 Python
解决python绘图使用subplots出现标题重叠的问题
2021/04/30 Python
一文搞懂Python Sklearn库使用
2021/08/23 Python