当前位置: 首页 > news >正文

spring中的DI

【知识要点】

  1. 控制反转(IOC)将对象的创建权限交给第三方模块完成,第三方模块需要将创建好的对象,以某种合适的方式交给引用对象去使用,这个过程称为依赖注入(DI)。如:A对象如果需要使用B对象的方法,则A类依赖B类。
  2. 对象装配是在对象构造过程中,对其属性进行初始化。对象的属性分为简单数据类型和复杂数据类型,简单数据类型通常指String、List、map等由高级语言提供的数据类型,复杂数据类型用户自定义数据类型或第三方的数据类型,对象的装配主要指对复杂数据类型的依赖注入(DI)。

【实验目的】

  • 了解基于xml的装配技术
  • 熟悉基于注解的装配技术
  • 掌握使用注解符@Autowired和@Resource的使用

【实验内容】

  • 定义学生类(Student)、课程类(Course)、班主任(ClassTeacher),学生类Student中有姓名、课程集合和班主任三个属性,对学生对象进行装配。
  • 基于xml的设值注入
  • 基于xml的构造注入
  • 基于注解的装配
  • 基于自动装配

【实验步骤】

一. 实验环境搭建

  1. 标准的spring控制台程序spring-assemble-demo5
  2. 在源代码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的设值注入

  1. 设置注入类中必须有对应的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等类型时,需要进一步描述数据类型等信息。

  1. 编写测试程序,在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());  }  
}
  1. 运行测试程序,结果如下所示

在这里插入图片描述

2. 基于xml的构造注入

  1. 使用构造注入装配时,类中必须包含带参构造函数,学生类修改后代码如下所示。
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对应构造函数的行参名,更加准确。

  1. 在测类中增加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());  }  
}  
  1. 运行测试程序,结果如下所示。
    在这里插入图片描述

3. 基于注解的装配

  1. 基于注解的装配,需要在代码的属性上使用注解符,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的对象进行注入。

  1. 在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());  }   
  1. 运行测试程序,测试结果如下
    在这里插入图片描述

自动装配技术

  1. 使用自动装配需要指定的属性需要有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;  
} 
  1. 自动装配依据配置文件中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,通过属性的类型实现自动装配。此种装配方式简单,但是缺乏灵活度,开发时几乎不用。

  1. 编写测试程序,在测试类中增加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());}
}
  1. 运行测试程序,执行结果如下图所示

在这里插入图片描述

小结

本节主要介绍了bean的装配实现过程,通常对于简单数据类型数据初始主要在获得对象后,使用setter方法完成,所谓的装配主要是复杂数据类型的依赖注入。Bean的装配可以基于xml配置、注解、自动化装配三种方式,当前主流的使用基于注解的装配,基于xml配置辅助,自动化装配技术几乎不用。在基于注解的配置中,特别注意注解符@Autowired和@Resource匹配规则及使用byType时,@Qualifier使用场景和原因。

相关文章:

spring中的DI

【知识要点】 控制反转&#xff08;IOC&#xff09;将对象的创建权限交给第三方模块完成&#xff0c;第三方模块需要将创建好的对象&#xff0c;以某种合适的方式交给引用对象去使用&#xff0c;这个过程称为依赖注入&#xff08;DI&#xff09;。如&#xff1a;A对象如果需要…...

gpt-4-vision-preview 识图

这些图片都是流行动画角色的插图。 第一张图片中的角色是一块穿着棕色方形裤子、红领带和白色衬衫的海绵&#xff0c;它站立着并露出开心的笑容。该角色在一个蓝色的背景前&#xff0c;显得非常兴奋和活泼。 第二张图片展示的是一只灰色的小老鼠&#xff0c;表情开心&#xf…...

Spring Framework 6.1 正式发布

Spring Framework 6.1.0 现已从 Maven Central 正式发布&#xff01;6.1 一代有几个关键主题&#xff1a; 拥抱 JDK 21 LTS虚拟线程&#xff08;Project Loom&#xff09;JVM 检查点恢复&#xff08;项目 CRaC&#xff09;重新审视资源生命周期管理重新审视数据绑定和验证新的…...

SystemVerilog学习 (11)——覆盖率

目录 一、概述 二、覆盖率的种类 1、概述 2、分类 三、代码覆盖率 四、功能覆盖率 五、从功能描述到覆盖率 一、概述 “验证如果没有量化&#xff0c;那么就意味着没有尽头。” 伴随着复杂SoC系统的验证难度系数成倍增加&#xff0c;无论是定向测试还是随机测试&#xff…...

jQuery,解决命名冲突的问题

使用noConflict(true)&#xff0c;把$和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实现&#xff1f; 把 shared_ptr 做成 lock_free&#xff0c;应该是没有技术上的可行性。shared_ptr 比一个指针要大不少&#xff1a;最近很多小伙伴找我&#xff0c;说想要一些C的资料&#xff0c;然后我根据自己从业十年经验&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架构&#xff1a;Intel 的CPU&#xff0c;所以支持Windows Server all 和Linux系统&#xff08;重装完系统可以用某60驱动管家更新所有硬件驱动&#xff09; 操作系统&#xff1a;本次我安装的服务器系统为Serv…...

windows 10 更新永久关闭

1 winR 输入&#xff1a;services.msc 编辑&#xff1a; 关闭&#xff1a;...

循环优先级仲裁~位屏蔽仲裁算法

参考了FPGA奇哥&#xff08;下列视频中UP主&#xff09;的讲解。 应该可以对多路读写DDR3进行操作&#xff0c;仅仲裁&#xff0c;不涉及DMA和Uibuf等。 2023年11月所写&#xff0c;暂未进行测试&#xff0c;日后补上。 第二天已完成测试&#xff0c;功能可行。 深入FPGA底层…...

千年版本修改小技巧

千年门派创建后消失的原因 门派在游戏里创建后重启服务器消失其实就差一个单词name&#xff0c;只要将这个单词加在 guild文件夹里的 createguild.sdb文件里的第一行第一个就可以。可以先将createguild.sdb的内容清空 然后复制以下内容到 createguild.sdb 最后保存下就可以了n…...

教学过程中可以实施哪些考核评价方式?

教学过程中可以实施哪些考核评价方式&#xff1f; 实践技能与理论知识考试结合&#xff1a;旨在综合考察学生对理论知识的掌握程度及其在实践中的运用能力。 模拟仿真与现场考试结合&#xff1a;通过模拟真实场景或者实际操作环境&#xff0c;考察学生在实际情境中解决问题的能…...

MyBatis查询数据库(全是精髓)

1. 什么是MyBatis&#xff1f; 简单说&#xff0c;MyBatis就是一个完成程序与数据库交互的工具&#xff0c;也就是更简单的操作和读取数据库的工具。 2. 怎么学习Mybatis Mybatis学习只分为两部分&#xff1a; 配置MyBatis开发环境使用MyBatis模式和语法操作数据库 3. 第一…...

elementPlus+vue3引入icon图标

安装包管理&#xff0c;推荐使用 yarn npm包有时候会有包冲突&#xff0c;在项目的根目录下执行&#xff0c;在终端下 # Yarn $ yarn add element-plus/icons-vue在main.js或main.ts中进行全局注册&#xff0c;导入所有图标 import * as ElementPlusIconsVue from element-plu…...

Spring框架中的bean管理(XML和注解及属性的注入)

Spring框架中IOC就是将创建对象的权力反转给Spring框架&#xff0c;我们无需自己创建对象&#xff0c;直接在Spring框架的容器中获取即可。 bean中配置的就是需要让Spring管理的类。 XML的bean管理 先写个“HelloWorld”: <bean id"User" class"com.ffyc.…...

MySQL 存储过程提高数据库效率和可维护性

MySQL 存储过程是一种强大的数据库功能&#xff0c;它允许你在数据库中存储和执行一组SQL语句&#xff0c;类似于编程中的函数。存储过程可以大幅提高数据库的性能、安全性和可维护性。本文将详细介绍MySQL存储过程的使用。 什么是MySQL存储过程&#xff1f; MySQL存储过程是一…...

JAXB的XmlElement注解

依赖 如果基于JAX-WS开发&#xff0c;可以在maven工程的pom.xml文件中增加如下依赖&#xff0c;会将依赖的JAXB库也下载下来&#xff1a; <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 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习的驾…...

59 权限提升-Win溢出漏洞及ATSCPS提权

目录 知识点必备&#xff1a;windows权限认识(用户及用户组)0x01 普通权限0x02特殊权限 演示案例:基于WEB环境下的权限提升-阿里云靶机基于本地环境下的权限提升-系统溢出漏洞基于本地环境下的权限提升-AT&SC&PS命令 案例给到的思路点总结如下:涉及资源: 这个章节会讲到…...

【新闻稿】Solv 与 zCloak 联合开发跨境贸易场景下可编程数字凭证项目,获得新加坡、加纳两国央行支持...

关于昨天 Solv 携手 zCloak 与新加坡和加纳两个央行合作的 Project DESFT&#xff0c;很多朋友都发来恭喜和祝福&#xff0c;并希望了解详情。这个事我们秘密努力了半年多&#xff0c;终于有一个阶段性的成果。这里我转载中文版官宣新闻稿&#xff0c;欢迎大家关注。等我忙过这…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...