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使用场景和原因。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/179355.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于反弹Shell个人的一些理解与学习收获

反弹Shell 概念&#xff1a; 反弹shell(reverse shell)&#xff0c;就是控制端(攻击者所有)监听某TCP/UDP端口&#xff0c;被控端发起请求到该端口&#xff0c;并将其命令行的输入输出转发到控制端。reverse shell与telnet&#xff0c;ssh等标准shell对应&#xff0c;本质上是…

Java绘图-第19章

Java绘图-第19章 1.Java绘图类 1.1Graphics类 Graphics类是用于绘制图形的抽象类&#xff0c;它是java.awt包中的一部分。Graphics类提供了各种方法&#xff0c;可以在图形上绘制各种形状、文本和图像。这些方法包括画线、画矩形、画椭圆、画弧、绘制图像等。 1.2Graphics2…

【差分演化算法相关文献总结】

差分演化算法相关文献总结 前言概述文献综述总结 前言 本人作为一名从事了三年演化算法研究的菜鸡研究生&#xff0c;其中大部分时间都在专注于差分演化算法&#xff08;Differential Evolution, DE&#xff09;的相关研究。现如今已经毕业&#xff0c;回顾往昔&#xff0c;经过…

11月15日星期三今日早报简报微语报早读

1、2023胡润女企业家榜出炉&#xff1a;郭得胜夫人邝肖卿首次成为中国女首富&#xff0c;龙湖吴亚军蝉联中国白手起家女首富&#xff1b; 2、叶剑英元帅夫人吴博逝世&#xff0c;享年106岁&#xff1b; 3、外交部&#xff1a;所谓“联合国军”是冷战产物&#xff0c;于法无据…

cudnn安装

安装地址 cudnn安装地址&#xff1a;https://developer.nvidia.com/rdp/cudnn-download 安装 选择windows版本的下载&#xff0c;我这里选择的这个&#xff1a; 下载之后解压即可。 后续 后续&#xff1a;第一步 把cudnn的bin&#xff0c;include&#xff0c;lib三个文件…

高并发架构设计(三大利器:缓存、限流和降级)

引言 高并发背景 互联网行业迅速发展&#xff0c;用户量剧增&#xff0c;系统面临巨大的并发请求压力。 软件系统有三个追求&#xff1a;高性能、高并发、高可用&#xff0c;俗称三高。三者既有区别也有联系&#xff0c;门门道道很多&#xff0c;全面讨论需要三天三夜&#…

vue3项目常用功能分享

Vue3常用功能分享 本文主要分享一下在使用vue3开发项目时的一些常用功能 一、自动注册全局组件 自动注册components目录下所有vue组件并以组件的文件名为组件的名称 // components/index.tsimport { type App, defineAsyncComponent } from vue const components Object.e…

十九章总结

Graphics类 Graphics类是所有图形上下文的抽象基类&#xff0c;封装了Java支持的基本绘图操作所需的状态信息&#xff0c;主要包括颜色、字体、画笔 Graphics2D类 Graphics2D类继承Graphics类实现功能更加强大的绘图操作集合 绘制图形 在项目中创建一个类&#xff0c;是该…

论文阅读:YOLOV: Making Still Image Object Detectors Great at Video Object Detection

发表时间&#xff1a;2023年3月5日 论文地址&#xff1a;https://arxiv.org/abs/2208.09686 项目地址&#xff1a;https://github.com/YuHengsss/YOLOV 视频物体检测&#xff08;VID&#xff09;具有挑战性&#xff0c;因为物体外观的高度变化以及一些帧的不同恶化。有利的信息…

天马行空的超级炫酷旋转图片-前端

一、实现代码&#xff08;html部分&#xff09; <!DOCTYPE html> <html> <head lang"en"><meta charset"UTF-8"><title>3D旋转</title><style type"text/css">*{padding: 0;margin: 0;}body,html{he…

OpenHarmony应用开发入门教程(一、开篇)

前言 华为正式宣布2024年发布的华为鸿蒙OS Next版将不再兼容安卓系统。这一重大改变&#xff0c;预示着华为鸿蒙OS即将进入一个全新的阶段。 都说科技无国界&#xff0c;这是骗人的鬼话。谷歌的安卓12.0系统早已发布&#xff0c;但是自从受到美影响&#xff0c;谷歌就拒绝再向…

飞天使-django之数据库简介

文章目录 增删改查解决数据库不能存储中文问题创建表数据类型表的基本操作主键唯一键 unique外键实战 增删改查 四个常用的语句查询 : insert delete update select insert into student(Sno,name) values(95001,"张三") delete from student where name张三 upda…