spring中的DI
【知识要点】
- 控制反转(IOC)将对象的创建权限交给第三方模块完成,第三方模块需要将创建好的对象,以某种合适的方式交给引用对象去使用,这个过程称为依赖注入(DI)。如:A对象如果需要使用B对象的方法,则A类依赖B类。
- 对象装配是在对象构造过程中,对其属性进行初始化。对象的属性分为简单数据类型和复杂数据类型,简单数据类型通常指String、List、map等由高级语言提供的数据类型,复杂数据类型用户自定义数据类型或第三方的数据类型,对象的装配主要指对复杂数据类型的依赖注入(DI)。
【实验目的】
- 了解基于xml的装配技术
- 熟悉基于注解的装配技术
- 掌握使用注解符@Autowired和@Resource的使用
【实验内容】
- 定义学生类(Student)、课程类(Course)、班主任(ClassTeacher),学生类Student中有姓名、课程集合和班主任三个属性,对学生对象进行装配。
- 基于xml的设值注入
- 基于xml的构造注入
- 基于注解的装配
- 基于自动装配
【实验步骤】
一. 实验环境搭建
- 标准的spring控制台程序spring-assemble-demo5
- 在源代码com.bjwl.service包中增加Student、Course、ClassTeacher三个类,具体代码如下所示。
public class Student { private String sname; private Integer sage; private List<Course> courses; private Teacher classTeacher;
} public class Course { private String courseName;
} public class Teacher { private String tname;
}
2. 基于xml的设值注入
- 设置注入类中必须有对应的setter方法和无参构造函数,对类Student中的代码改造如下所示。
public class Student { private String sname; private Integer sage; private List<Course> courses; private Teacher classTeacher; public void setSname(String sname) { this.sname = sname; } public void setSage(Integer sage) { this.sage = sage; } public void setCourses(List<Course> courses) { this.courses = courses; } public void setClassTeacher(Teacher classTeacher) { this.classTeacher = classTeacher; } @Overridepublic String toString() {return "Student{" +"sname='" + sname + '\'' +", sage=" + sage +", courses=" + courses +", classTeacher=" + classTeacher +'}';}
}
类Course 和Teacher 按照上述代码添加setter方法,在此不再赘述。
2. 在resources目录下添加spring配置文件spring-assemble-set.xml,代码如下所示。
<beans> <!--基于属性注入(设置注入)的bean装配--> <bean id="teacher" class="com.bjwl.service.setter.Teacher"> <property name="tname" value="李老师"></property> </bean> <bean id="student" class="com.bjwl.service.setter.Student"> <property name="sname" value="张三"></property> <property name="sage" value="18"></property> <property name="classTeacher" ref="teacher"></property> <property name="courses"> <list value-type="com.bjwl.service.setter.Course"> <bean class="com.bjwl.service.setter.Course"> <property name="courseName" value="数据结构"></property> </bean> <bean class="com.bjwl.service.setter.Course"> <property name="courseName" value="数据库原理"></property> </bean> </list> </property> </bean>
</beans>
在配置文件中property对应对象的属性, value对应简单数据类型的属性值;当属性值是由spring管理的对象时使用ref引用属性值,当使用list、map等类型时,需要进一步描述数据类型等信息。
- 编写测试程序,在com.bjwl.service包中添加AssembleTest,定义测试方法,代码如下所示。
public class AssembleTest { @Test public void setterTest(){ ApplicationContext context = new ClassPathXmlApplicationContext("spring-assemble-set.xml"); Student student = (Student)context.getBean("student"); System.out.println(student.toString()); }
}
- 运行测试程序,结果如下所示

2. 基于xml的构造注入
- 使用构造注入装配时,类中必须包含带参构造函数,学生类修改后代码如下所示。
public class Student { private String sname; private Integer sage; private List<Course> courses; private Teacher classTeacher; public Student(String sname, Integer sage, List<Course> courses, Teacher classTeacher) { this.sname = sname; this.sage = sage; this.courses = courses; this.classTeacher = classTeacher; } @Override public String toString() { return "Student{" + "sname='" + sname + '\'' + ", sage=" + sage + ", courses=" + courses + ", classTeacher=" + classTeacher + '}'; }
}
类Course 和Teacher 按照上述代码添加setter方法,在此不再赘述。
2. 在resources目录下添加spring配置文件spring-constructor.xml,代码如下所示。
<beans> <bean id="teacher" class="com.bjwl.service.constructor.Teacher"> <constructor-arg index="0" value="张三"></constructor-arg> </bean> <bean id="student" class="com.bjwl.service.constructor.Student"> <constructor-arg index="0" value="张三"></constructor-arg> <constructor-arg index="1" value="18"></constructor-arg> <constructor-arg index="3" ref="teacher"></constructor-arg> <constructor-arg index="2"> <list value-type="com.bjwl.service.constructor.Course"> <bean class="com.bjwl.service.constructor.Course"> <constructor-arg name="courseName" value="数据结构"></constructor-arg> </bean> <bean class="com.bjwl.service.constructor.Course"> <constructor-arg name="courseName" value="数据库原理"></constructor-arg> </bean> </list> </constructor-arg > </bean>
代码中constructor-arg标签为构造注入标签,constructor-arg中index是参数的索引,value对应简单数据类型的属性值;当属性值是由spring管理的对象时使用ref引用属性值。注意:在正式开发中通常使用constructor-arg标签中使用name属性,而不是index属性,因为name对应构造函数的行参名,更加准确。
- 在测类中增加constructorTest测试方法,代码如下所示。
public class AssembleTest { @Test public void constructorTest(){ ApplicationContext context = new ClassPathXmlApplicationContext("spring-constructor.xml"); Student student = context.getBean("student",Student.class); System.out.println(student.toString()); }
}
- 运行测试程序,结果如下所示。

3. 基于注解的装配
- 基于注解的装配,需要在代码的属性上使用注解符,Student的代码修改如下所示。
@Component
public class Student { @Value("张三") private String sname; @Value("18") private Integer sage; @Value("#{courses}") private List<Course> courses; @Autowired private Teacher classTeacher;
} @Component
public class Teacher { @Value("李老师") private String tname;
} @Component
public class Course { public void setCourseName(String courseName) { this.courseName = courseName; } private String courseName;
}
代码中在类上添加的注解符@Component ,代表这个类创建的对象交给spring进行管理,在属性上的@Value注解符,代表简单数据类型属性注入,@Autowired代表对象的注入。对于list、map的注入还要借助xml完成,如:课程集合的注入。
注意:对象注入时,使用@Autowired注解符是spring提供的,注入依据数据类型(byType),如:classTeacher属性注入,是spring在对象池中寻找类型为Teacher的对象,然后进行匹配,如果系统中存在两个或两个以上类型为Teacher的对象,需要借助另外一个注解符@Qualifier完成;另外JDK还提供了一个注解符@Resource,也可以完成依赖注入,注入依据对象的名称(byName),上例中需要在对象池中寻找名称为classTeacher的对象进行注入。
- 在resources目录下添加spring配置文件spring-annotation.xml,代码如下所示
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <context:annotation-config /> <context:component-scan base-package="com.bjwl.service.annotation" /> <util:list id="courses"> <bean id="course1" class="com.bjwl.service.annotation.Course" > <property name="courseName" value="数据结构"></property> </bean> <bean id="course2" class="com.bjwl.service.annotation.Course" > <property name="courseName" value="数据库原理"></property> </bean> </util:list>
</beans>
代码的第3、7、8行引入context的头部文件,第12行开启注解注解Bean装配,第13行声明组件扫描位置
3. 编写测试程序,在测试类中增加AnnotationTest 方法,代码如下所示。
public void setterTest(){ ApplicationContext context = new ClassPathXmlApplicationContext("spring-annotation.xml"); Student student = (Student)context.getBean("student"); System.out.println(student.toString()); }
- 运行测试程序,测试结果如下

自动装配技术
- 使用自动装配需要指定的属性需要有setter方法。自动装配技术可以依赖使用xml方式和注解方式对bean的管理,在此仅演示使用注解方式的自动装配,简单数据类型使用注解的方式完成,主要演示班主任(classTeacher)的注入,修改student类,代码如下所示。
public class Student { @Value("李四") private String sname; @Value("18") private Integer sage; private Teacher classTeacher; public void setSname(String sname) { this.sname = sname; } public void setSage(Integer sage) { this.sage = sage; } public void setClassTeacher(Teacher classTeacher) { this.classTeacher = classTeacher; } @Override public String toString() { //省略}
} @Component("classTeacher")
public class Teacher { @Override public String toString() { //省略 } @Value("zhangsan") private String tname;
}
- 自动装配依据配置文件中bean标签的autowire属性完成自动装配规则的定义,在resources目录下添加spring配置文件spring-auto.xml,配置文件代码如下。
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd" default-autowire="byName"> <context:annotation-config /> <context:component-scan base-package="com.bjwl.service.auto" />
</beans>
代码第7行beans 指定default-autowire属性的值为byName,通过属性的名称实现自动装配,此时要求student的classTeacher属性名必须 bean所对应的名称完全一致,default-autowire属性值也可以是为byType,通过属性的类型实现自动装配。此种装配方式简单,但是缺乏灵活度,开发时几乎不用。
- 编写测试程序,在测试类中增加AutoTest 方法,代码如下所示。
public class AutoTest {@Testpublic void test(){ApplicationContext context = new ClassPathXmlApplicationContext("spring-auto.xml");Student student = context.getBean("student", Student.class);System.out.println(student.toString());}
}
- 运行测试程序,执行结果如下图所示

小结
本节主要介绍了bean的装配实现过程,通常对于简单数据类型数据初始主要在获得对象后,使用setter方法完成,所谓的装配主要是复杂数据类型的依赖注入。Bean的装配可以基于xml配置、注解、自动化装配三种方式,当前主流的使用基于注解的装配,基于xml配置辅助,自动化装配技术几乎不用。在基于注解的配置中,特别注意注解符@Autowired和@Resource匹配规则及使用byType时,@Qualifier使用场景和原因。
相关文章:
spring中的DI
【知识要点】 控制反转(IOC)将对象的创建权限交给第三方模块完成,第三方模块需要将创建好的对象,以某种合适的方式交给引用对象去使用,这个过程称为依赖注入(DI)。如:A对象如果需要…...
gpt-4-vision-preview 识图
这些图片都是流行动画角色的插图。 第一张图片中的角色是一块穿着棕色方形裤子、红领带和白色衬衫的海绵,它站立着并露出开心的笑容。该角色在一个蓝色的背景前,显得非常兴奋和活泼。 第二张图片展示的是一只灰色的小老鼠,表情开心…...
Spring Framework 6.1 正式发布
Spring Framework 6.1.0 现已从 Maven Central 正式发布!6.1 一代有几个关键主题: 拥抱 JDK 21 LTS虚拟线程(Project Loom)JVM 检查点恢复(项目 CRaC)重新审视资源生命周期管理重新审视数据绑定和验证新的…...
SystemVerilog学习 (11)——覆盖率
目录 一、概述 二、覆盖率的种类 1、概述 2、分类 三、代码覆盖率 四、功能覆盖率 五、从功能描述到覆盖率 一、概述 “验证如果没有量化,那么就意味着没有尽头。” 伴随着复杂SoC系统的验证难度系数成倍增加,无论是定向测试还是随机测试ÿ…...
jQuery,解决命名冲突的问题
使用noConflict(true),把$和jQuery名字都给别人 <body><script>var $ zanvar jQuery lan</script><script src"./jquery.js"></script><script>console.log(jQuery, 11111); // 打印jquery函数console.log($, 222…...
为什么C++标准库中atomic shared_ptr不是lockfree实现?
为什么C标准库中atomic shared_ptr不是lockfree实现? 把 shared_ptr 做成 lock_free,应该是没有技术上的可行性。shared_ptr 比一个指针要大不少:最近很多小伙伴找我,说想要一些C的资料,然后我根据自己从业十年经验&am…...
Python基础入门例程58-NP58 找到HR(循环语句)
最近的博文: Python基础入门例程57-NP57 格式化清单(循环语句)-CSDN博客 Python基础入门例程56-NP56 列表解析(循环语句)-CSDN博客 Python基础入门例程55-NP55 2的次方数(循环语句)-CSDN博客 目录 最近的博文: 描述...
航天联志Aisino-AISINO26081R服务器通过调BIOS用U盘重新做系统(windows系统通用)
产品名称:航天联志Aisino系列服务器 产品型号:AISINO26081R CPU架构:Intel 的CPU,所以支持Windows Server all 和Linux系统(重装完系统可以用某60驱动管家更新所有硬件驱动) 操作系统:本次我安装的服务器系统为Serv…...
windows 10 更新永久关闭
1 winR 输入:services.msc 编辑: 关闭:...
循环优先级仲裁~位屏蔽仲裁算法
参考了FPGA奇哥(下列视频中UP主)的讲解。 应该可以对多路读写DDR3进行操作,仅仲裁,不涉及DMA和Uibuf等。 2023年11月所写,暂未进行测试,日后补上。 第二天已完成测试,功能可行。 深入FPGA底层…...
千年版本修改小技巧
千年门派创建后消失的原因 门派在游戏里创建后重启服务器消失其实就差一个单词name,只要将这个单词加在 guild文件夹里的 createguild.sdb文件里的第一行第一个就可以。可以先将createguild.sdb的内容清空 然后复制以下内容到 createguild.sdb 最后保存下就可以了n…...
教学过程中可以实施哪些考核评价方式?
教学过程中可以实施哪些考核评价方式? 实践技能与理论知识考试结合:旨在综合考察学生对理论知识的掌握程度及其在实践中的运用能力。 模拟仿真与现场考试结合:通过模拟真实场景或者实际操作环境,考察学生在实际情境中解决问题的能…...
MyBatis查询数据库(全是精髓)
1. 什么是MyBatis? 简单说,MyBatis就是一个完成程序与数据库交互的工具,也就是更简单的操作和读取数据库的工具。 2. 怎么学习Mybatis Mybatis学习只分为两部分: 配置MyBatis开发环境使用MyBatis模式和语法操作数据库 3. 第一…...
elementPlus+vue3引入icon图标
安装包管理,推荐使用 yarn npm包有时候会有包冲突,在项目的根目录下执行,在终端下 # Yarn $ yarn add element-plus/icons-vue在main.js或main.ts中进行全局注册,导入所有图标 import * as ElementPlusIconsVue from element-plu…...
Spring框架中的bean管理(XML和注解及属性的注入)
Spring框架中IOC就是将创建对象的权力反转给Spring框架,我们无需自己创建对象,直接在Spring框架的容器中获取即可。 bean中配置的就是需要让Spring管理的类。 XML的bean管理 先写个“HelloWorld”: <bean id"User" class"com.ffyc.…...
MySQL 存储过程提高数据库效率和可维护性
MySQL 存储过程是一种强大的数据库功能,它允许你在数据库中存储和执行一组SQL语句,类似于编程中的函数。存储过程可以大幅提高数据库的性能、安全性和可维护性。本文将详细介绍MySQL存储过程的使用。 什么是MySQL存储过程? MySQL存储过程是一…...
JAXB的XmlElement注解
依赖 如果基于JAX-WS开发,可以在maven工程的pom.xml文件中增加如下依赖,会将依赖的JAXB库也下载下来: <dependency><groupId>jakarta.xml.ws</groupId><artifactId>jakarta.xml.ws-api</artifactId><vers…...
竞赛选题 深度学习驾驶行为状态检测系统(疲劳 抽烟 喝水 玩手机) - opencv python
文章目录 1 前言1 课题背景2 相关技术2.1 Dlib人脸识别库2.2 疲劳检测算法2.3 YOLOV5算法 3 效果展示3.1 眨眼3.2 打哈欠3.3 使用手机检测3.4 抽烟检测3.5 喝水检测 4 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于深度学习的驾…...
59 权限提升-Win溢出漏洞及ATSCPS提权
目录 知识点必备:windows权限认识(用户及用户组)0x01 普通权限0x02特殊权限 演示案例:基于WEB环境下的权限提升-阿里云靶机基于本地环境下的权限提升-系统溢出漏洞基于本地环境下的权限提升-AT&SC&PS命令 案例给到的思路点总结如下:涉及资源: 这个章节会讲到…...
【新闻稿】Solv 与 zCloak 联合开发跨境贸易场景下可编程数字凭证项目,获得新加坡、加纳两国央行支持...
关于昨天 Solv 携手 zCloak 与新加坡和加纳两个央行合作的 Project DESFT,很多朋友都发来恭喜和祝福,并希望了解详情。这个事我们秘密努力了半年多,终于有一个阶段性的成果。这里我转载中文版官宣新闻稿,欢迎大家关注。等我忙过这…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...
【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...
热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁
赛门铁克威胁猎手团队最新报告披露,数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据,严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能,但SEMR…...
