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并发编程之Executor接口的使用
Jun 21 Java/Android
Java如何实现树的同构?
Jun 22 Java/Android
Java并发编程之详解CyclicBarrier线程同步
Jun 23 Java/Android
死磕 java同步系列之synchronized解析
Jun 28 Java/Android
Java SSH 秘钥连接mysql数据库的方法
Jun 28 Java/Android
Spring中bean的生命周期之getSingleton方法
Jun 30 Java/Android
java调用Restful接口的三种方法
Aug 23 Java/Android
Spring中的使用@Async异步调用方法
Nov 01 Java/Android
使用Spring处理x-www-form-urlencoded方式
Nov 02 Java/Android
Java Spring Boot 正确读取配置文件中的属性的值
Apr 20 Java/Android
maven 解包依赖项中的文件的解决方法
Jul 15 Java/Android
HttpClient实现文件上传功能
Aug 14 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
PR值查询 | PageRank 查询
2006/12/20 PHP
php生成静态文件的多种方法分享
2012/07/17 PHP
web server使用php生成web页面的三种方法总结
2013/10/28 PHP
php实例分享之mysql数据备份
2014/05/19 PHP
php+mysql实现数据库随机重排实例
2014/10/17 PHP
Yii统计不同类型邮箱数量的方法
2016/10/18 PHP
laravel5.1框架model类查询的实现方法
2019/10/08 PHP
解决在Laravel 中处理OPTIONS请求的问题
2019/10/11 PHP
javascript操作数组详解
2014/12/17 Javascript
jQuery检测鼠标左键和右键点击的方法
2015/03/17 Javascript
JavaScript实现表格快速变色效果代码
2015/08/19 Javascript
Node.js 日志处理模块log4js
2016/08/28 Javascript
vue.js初学入门教程(2)
2016/11/07 Javascript
原生js实现放大镜效果
2017/01/11 Javascript
jQuery插件HighCharts绘制2D圆环图效果示例【附demo源码下载】
2017/03/09 Javascript
详解Webstorm 新建.vue文件支持高亮vue语法和es6语法
2017/10/26 Javascript
小程序测试后台服务的方法(ngrok)
2019/03/08 Javascript
vue页面切换项目实现转场动画的方法
2019/11/12 Javascript
ant design vue中表格指定格式渲染方式
2020/10/28 Javascript
Python黑魔法@property装饰器的使用技巧解析
2016/06/16 Python
简单掌握Python的Collections模块中counter结构的用法
2016/07/07 Python
Python切片索引用法示例
2018/05/15 Python
Python创建一个空的dataframe,并循环赋值的方法
2018/11/08 Python
pandas去除重复列的实现方法
2019/01/29 Python
python代码 FTP备份交换机配置脚本实例解析
2019/08/01 Python
带你彻底搞懂python操作mysql数据库(cursor游标讲解)
2020/01/06 Python
解决python运行启动报错问题
2020/06/01 Python
上课迟到检讨书
2014/02/19 职场文书
酒店员工职业生涯规划
2014/02/25 职场文书
商铺消防安全责任书
2014/07/29 职场文书
上诉状格式
2015/05/23 职场文书
2015少先队大队辅导员工作总结
2015/07/24 职场文书
应收账款管理制度
2015/08/06 职场文书
实用求职信模板范文
2019/05/13 职场文书
MongoDB balancer的使用详解
2021/04/30 MongoDB
日本十大血腥动漫,那些被禁播的动漫盘点
2022/03/21 日漫