Spring DI简介及依赖注入方式和依赖注入类型

news/2024/5/2 4:31:52/文章来源:https://blog.csdn.net/qq_53317005/article/details/130447022

目录

一、什么是依赖注入

二、依赖注入方式

1. Setter注入

2. 构造方法注入

3. 自动注入 

三、依赖注入类型

1. 注入bean类型

2. 注入基本数据类型

3. 注入List集合

4. 注入Set集合

5. 注入Map集合

6. 注入Properties对象

往期专栏&文章相关导读 

1. Maven系列专栏文章

2. Mybatis系列专栏文章

3. Spring系列专栏文章


一、什么是依赖注入

依赖注入(Dependency Injection,简称DI),它是Spring控制反转思想的具体实现。
控制反转将对象的创建交给了Spring,但是对象中可能会依赖其他对象。比如service类中要有dao类的属性,我们称service依赖于dao。之前需要手动注入属性值,代码如下:

public interface StudentDao {
  Student findById(int id);
}
public class StudentDaoImpl implements StudentDao{
  @Override
  public Student findById(int id) {
    // 模拟根据id查询学生
    return new Student(1,"程序员","北京");
 }
}
public class StudentService {

   // service依赖dao,手动注入属性值,即手动维护依赖关系
  private StudentDao studentDao = new StudentDaoImpl();
  public Student findStudentById(int id){
    return studentDao.findById(id);
 }
}

        此时,当StudentService的想要使用StudentDao的另一个实现类如StudentDaoImpl2时,则需要修改Java源码,造成代码的可维护性降低。

        而使用Spring框架后,Spring管理Service对象与Dao对象,此时它能够为Service对象注入依赖的Dao属性值。这就是Spring的依赖注入。简单来说,控制反转是创建对象,依赖注入是为对象的属性赋值

二、依赖注入方式

1. Setter注入

被注入类编写属性的setter方法

    public void setStudentDao(StudentDao studentDao){this.studentDao = studentDao;}

配置文件中,给需要注入属性值的 <bean> 中设置 <property>

<bean id="studentDao" class="com.itbaizhan.dao.StudentDaoImpl"> </bean>
<bean id="studentService" class="com.itbaizhan.service.StudentService"><!--依赖注入--><!--name:对象的属性名 ref:容器中对象的id值--><property name="studentDao" ref="studentDao"></property>
</bean>

测试 

新增测试方法

    // 测试依赖注入@Testpublic void t6(){ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");StudentService service = (StudentService) ac.getBean("studentService");System.out.println(service.findStudentById(8));}

运行结果 

OK,确实成功测试到了 

2. 构造方法注入

被注入类编写有参的构造方法

    public StudentService(StudentDao studentDao){this.studentDao = studentDao;}

给需要注入属性值的 <bean> 中设置 <constructor-arg>

<bean id="studentDao" class="com.itbaizhan.dao.StudentDaoImpl"></bean>
<bean id="studentService" class="com.itbaizhan.service.StudentService"><!-- 依赖注入 --><!-- name:对象的属性名 ref:配置文件中注入对象的id值 --><constructor-arg name="studentDao" ref="studentDao"></constructor-arg>
</bean>

测试结果: 

OK,确实也是可以使用的 

3. 自动注入 

        自动注入不需要在 <bean> 标签中添加其他标签注入属性值,而是自动从容器中找到相应的bean对象设置为属性值。

自动注入有两种配置方式:

  • 全局配置:在 <beans> 中设置 default-autowire 属性可以定义所有bean对象的自动注入策略。
  • 局部配置:在 <bean> 中设置 autowire 属性可以定义当前bean对象的自动注入策略。

autowire的取值如下:

  • no:不会进行自动注入。
  • default:全局配置default相当于no,局部配置default表示使用全局配置
  • byName:在Spring容器中查找id与属性名相同的bean,并进行注入。需要提供set方法。
  • byType:在Spring容器中查找类型与属性类型相同的bean,并进行注入。需要提供set方法。
  • constructor:在Spring容器中查找id与属性名相同的bean,并进行注入。需要提供构造方法。

三、依赖注入类型

        DI支持注入bean类型、基本数据类型和字符串、List集合、Set集合、Map集合、Properties对象类型等,他们的写法如下:

准备注入属性的类 

package com.example.service;import com.example.dao.StudentDao;
import com.example.pojo.Student;import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;public class StudentService {// service依赖dao,手动注入属性值,即手动维护依赖关系//private StudentDao studentDao;// bean属性private StudentDao studentDao;// 字符串类型private String name;// 基本数据类型private int count;// 字符串List集合private List<String> students1;// 对象类型List集合private List<Student> nameList;// 字符串类型Set集合private Set<String> students2;// 字符串类型Map集合private Map<String, String> students3;// 对象类型map集合private Map<String,Student> studentMap;// Properties类型private Properties properties;public StudentService(){}public StudentService(StudentDao studentDao){this.studentDao = studentDao;}public Student findStudentById(int id){return studentDao.findById(id);}public void setStudentDao(StudentDao studentDao){this.studentDao = studentDao;}public StudentDao getStudentDao() {return studentDao;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getCount() {return count;}public void setCount(int count) {this.count = count;}public List<String> getStudents1() {return students1;}public void setStudents1(List<String> students1) {this.students1 = students1;}public Set<String> getStudents2() {return students2;}public void setStudents2(Set<String> students2) {this.students2 = students2;}public Map<String, String> getNames2() {return students3;}public void setNames2(Map<String, Student> names2) {this.studentMap = names2;}public Map<String, String> getStudents3() {return students3;}public void setStudents3(Map<String, String> students3) {this.students3 = students3;}public Properties getProperties() {return properties;}public void setProperties(Properties properties) {this.properties = properties;}public List<Student> getNameList() {return nameList;}public void setNameList(List<Student> nameList) {this.nameList = nameList;}@Overridepublic String toString() {return "StudentService[ " +"studentDao=" + studentDao +", name='" + name + '\'' +", count=" + count +", students1=" + students1 +", nameList=" + nameList +", students2=" + students2 +", students3=" + students3 +", studentMap=" + studentMap +", properties=" + properties +" ]";}
}

准备测试方法

    // 测试注入类型@Testpublic void t7(){ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");StudentService service = (StudentService) ac.getBean("studentService");System.out.println(service);}

1. 注入bean类型

    <!-- 注入bean类型 --><bean id="studentDao" class="com.example.dao.StudentDaoImpl1"/><!-- 写法1 --><bean id="studentService" class="com.example.service.StudentService"><property name="studentDao" ref="studentDao"/></bean><!-- 写法2 --><!--<bean id="studentService" class="com.example.service.StudentService"><property name="studentDao"><ref bean="studentDao"/></property></bean>-->

2. 注入基本数据类型

        <!-- 注入基本数据类型 --><!-- 写法一 name:属性名 value:属性值 --><property name="name" value="程序员"/><!-- 写法二 name:属性名 value:属性值--><property name="count"><value>10</value></property>

3. 注入List集合

    <!-- 注入List集合 --><!-- 简单的数据类型List集合 name:属性名 --><property name="students1" ><list><value>上海</value><value>广州</value></list></property><!-- 对象类型的List集合 name:属性名 --><property name="nameList"><list><bean class="com.example.pojo.Student"><property name="id" value="1"/><property name="name" value="几何心凉"/><property name="address" value="北京"/></bean><bean class="com.example.pojo.Student"><property name="id" value="2"/><property name="name" value="哈士奇"/><property name="address" value="上海"/></bean></list></property>

4. 注入Set集合

        <!-- 注入Set集合 --><property name="students2"><set><value>深圳</value><value>北京</value></set></property>

5. 注入Map集合

        <!-- 注入Map集合 --><property name="students3"><map><entry key="哈士奇" value="上海"/><entry key="几何心凉" value="北京"/></map></property><!-- 注入对象类型map类型 --><property name="names2"><map><entry key="student1" value-ref="s1"/><entry key="student2" value-ref="s2"/></map></property>
    <bean id="s1" class="com.example.pojo.Student"><property name="id" value="1"/><property name="name" value="几何心凉"/><property name="address" value="北京"/></bean><bean id="s2" class="com.example.pojo.Student"><property name="id" value="2"/><property name="name" value="哈士奇"/><property name="address" value="上海"/></bean>

 上面是用到的bean对象

6. 注入Properties对象

        <!-- 注入properties --><property name="properties"><props><prop key="配置1">值1</prop><prop key="配置2">值2</prop></props></property>

运行测试方法测试一下

OK ,可以看到都是插入的了。

往期专栏&文章相关导读 

     大家如果对于本期内容有什么不了解的话也可以去看看往期的内容,下面列出了博主往期精心制作的Maven,Mybatis等专栏系列文章,走过路过不要错过哎!如果对您有所帮助的话就点点赞,收藏一下啪。其中Spring专栏有些正在更,所以无法查看,但是当博主全部更完之后就可以看啦。

1. Maven系列专栏文章

Maven系列专栏Maven工程开发
Maven聚合开发【实例详解---5555字】

2. Mybatis系列专栏文章

Mybatis系列专栏MyBatis入门配置
Mybatis入门案例【超详细】
MyBatis配置文件 —— 相关标签详解
Mybatis模糊查询——三种定义参数方法和聚合查询、主键回填
Mybatis动态SQL查询 --(附实战案例--8888个字--88质量分)
Mybatis分页查询——四种传参方式
Mybatis一级缓存和二级缓存(带测试方法)
Mybatis分解式查询
Mybatis关联查询【附实战案例】
MyBatis注解开发---实现增删查改和动态SQL
MyBatis注解开发---实现自定义映射关系和关联查询

3. Spring系列专栏文章

Spring系列专栏Spring IOC 入门简介【自定义容器实例】
IOC使用Spring实现附实例详解
Spring IOC之对象的创建方式、策略及销毁时机和生命周期且获取方式
Spring DI简介及依赖注入方式和依赖注入类型
Spring IOC相关注解运用——上篇
Spring IOC相关注解运用——下篇
Spring AOP简介及相关案例
注解、原生Spring、SchemaBased三种方式实现AOP【附详细案例】
Spring事务简介及相关案例
Spring 事务管理方案和事务管理器及事务控制的API
Spring 事务的相关配置、传播行为、隔离级别及注解配置声明式事务

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

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

相关文章

项目管理软件可以用来做什么?这篇文章说清楚了

项目管理软件是用来干嘛的&#xff0c;就得看对项目的理解。项目是为创造独特的产品、服务或成果而进行的临时性工作。建造一座大楼可以是一个项目&#xff0c;进行一次旅游活动、日常办公活动、期末考试复习等也都可以看成一个项目。 项目管理不善会导致项目超时、超支、返工、…

『python爬虫』05. requests模块入门(保姆级图文)

目录 安装requests1. 抓取搜狗搜索内容 requests.get2. 抓取百度翻译数据 requests.post3. 豆瓣电影喜剧榜首爬取4. 关于请求头和关闭request连接总结 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 安装requests …

【Linux】4. 开发工具的使用(yum/vim)

前言 工具的本质就是指令 在介绍工具之前先介绍一下互联网生态 Linux 软件包管理器 yum 1. 什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以…

SQL(基础)

DDL: 数据定义语言 Definition&#xff0c;用来定义数据库对象&#xff08;数据库、表、字段&#xff09;CREATE、DROP、ALTER DML: 数据操作语言 Manipulation&#xff0c;用来对数据库表中的数据进行增删改 INSERT、UPDATE、DELETE 注意&#xff1a; DDL是改变表的结构 DML…

享受简单上传体验:将Maven仓库迁移到GitHub

前言&#xff1a;我为什么放弃了Maven Central 之前我写过一篇《Android手把手&#xff0c;发布开源组件至 MavenCentral仓库》&#xff0c;文中详细介绍了如何发布组件到Maven Central中供所有开发者共用。但是最近使用下来&#xff0c;发现Sonatype JIRA 的Maven Center上传…

EMC VPLEX VS2 FRU故障备件更换基本流程

本文是针对VPLEX VS2 备件更换流程的详细操作方法&#xff0c;其实VS6也是类似的。 首先要说明一点&#xff0c;EMC VPLEX的任何硬件故障更换都不是直接插拔来完成的&#xff0c;一定要执行脚本要完成更换&#xff0c;本文就是描述如何启动这个脚本和常见的一些问题&#xff0…

一以贯之:从城市网络到“城市一张网”

《论语里仁》中子曰&#xff1a;“参乎&#xff0c;吾道一以贯之”。 孔子所说的“一以贯之”&#xff0c;逐渐成为了中国文化与哲学的重要组成部分&#xff0c;指明事物发展往往需要以标准化、集约化、融合化作为目标。这种智慧在数字化发展中格外重要。从云计算、大数据技术模…

C++——入门基础知识

0.关注博主有更多知识 C知识合集 目录 1.命名空间 1.1命名空间的定义 1.2命名空间的使用 1.3命名空间定义的补充 2.输入与输出 3.缺省参数 3.1全缺省参数 3.2半缺省参数 3.3缺省参数的补充 4.函数重载 4.1C为什么支持函数重载&#xff1f; &#xff15;.引用 5.…

Clion开发STM32之串口封装(HAL库)

前提 在开发STM32过程中&#xff0c;芯片提供的串口引脚一般是不会发生变化的&#xff0c;所以为了方便移植&#xff0c;借助HAL提供的注册回调函数自定义&#xff0c;这边重新进行简要的封装此工程开发是以Clion为开发的IDE,用keil只需将对应的文件进行移植即可.文章末尾附带…

Java——Java面向对象

该系列博文会告诉你如何从入门到进阶&#xff0c;一步步地学习Java基础知识&#xff0c;并上手进行实战&#xff0c;接着了解每个Java知识点背后的实现原理&#xff0c;更完整地了解整个Java技术体系&#xff0c;形成自己的知识框架。 概述&#xff1a; Java是面向对象的程序…

XR技术在手术中的应用调研

虚拟现实、增强现实、混合现实等概念和技术是最近几年发展起来的&#xff0c;相信你对去年大火的元宇宙深有感触&#xff0c;元宇宙属于虚拟现实的技术范畴&#xff0c;头号玩家电影也让虚拟现实走进大众的视野中。早在2015年&#xff0c;笔者参加一次展会时就有接触&#xff0…

py_rabbitmq

安装 服务端 https://www.jianshu.com/p/2fb6d5ac17b9 客户端 pip install pika文档 https://rabbitmq.com/tutorials/tutorial-one-python.html 简单示例 生产者 import pika import rabbitmq_study.settings as settingscredentials pika.PlainCredentials(settings…

手记系列之四 ----- 关于使用MySql的一些经验

前言 本篇文章主要介绍的关于本人在使用MySql记录笔记的一些使用方法和经验&#xff0c;温馨提示&#xff0c;本文有点长&#xff0c;约1.5w字&#xff0c;几十张图片&#xff0c;建议收藏查看。 一、MySql安装 下载地址:https://dev.mysql.com/downloads/ 在安装MySql之前&a…

闪电加密和隐藏加密文件夹忘记密码怎么办?

闪电加密和隐藏加密是文件夹加密超级大师的两种文件夹加密类型&#xff0c;它们都拥有超快的加密算法&#xff0c;可以瞬间加密超大文件夹。那么这两种文件夹加密类型忘记密码该怎么办呢&#xff1f;下面我们一起来了解一下吧。 闪电加密和隐藏加密文件夹找回密码 首先&#x…

【计算机图形学】课堂习题汇总

在直线的光栅化算法中&#xff0c;如果不考虑最大位移方向则可能得到怎样的直线&#xff1f; A&#xff1a;斜率为1的线 B&#xff1a;总是垂直的 C&#xff1a;离散的点&#xff0c;无法构成直线 D&#xff1a;总是水平的 在直线的改进的Bresenham算法中&#xff0c;每当误…

【五一创作】使用Scala二次开发Spark3.3.0实现对MySQL的upsert操作

使用Scala二次开发Spark实现对MySQL的upsert操作 背景 在我们的数仓升级项目中&#xff0c;遇到了这样的场景&#xff1a;古人开发的任务是使用DataStage运算后&#xff0c;按照主键【或者多个字段拼接的唯一键】来做insert then update&#xff0c;顾名思义&#xff0c;也就…

【C++】vector OJ练习

文章目录 1. 只出现一次的数字思路讲解AC代码 2. 杨辉三角思路讲解AC代码 3. 只出现一次的数字 III思路讲解AC代码 4. 只出现一次的数字 II思路讲解AC代码 5. 删除有序数组中的重复项思路讲解AC代码 6. 数组中出现次数超过一半的数字思路讲解AC代码 这篇文章我们来做几道vector…

服装店铺装修有哪些窍门?做好这3点,顾客主动上门

现在街边有各种各样的服装店&#xff0c;有的服装店客流不断&#xff0c;有的服装店却很冷清&#xff0c;导致这种现象的原因有很多&#xff0c;比较重要的一点就是你的服装店铺装修没做好。 你的服装店铺装修足够吸引人吗&#xff1f; 什么样的服装店铺装修才能吸引顾客&#…

【VM服务管家】VM4.0平台SDK_2.5 全局工具类

目录 2.5.1 全局相机&#xff1a;全局相机设置参数的方法2.5.2 全局相机&#xff1a;获取全局相机列表的方法2.5.3 全局通信&#xff1a;通信管理中设备开启状态管理2.5.4 全局通信&#xff1a;接收和发送数据的方法2.5.5 全局变量获取和设置全局变量的方法 2.5.1 全局相机&…

最新发布!面向开发者的 ChatGPT Prompt Engineering 免费教程,吴恩达与OpenAI合作打造!...

就在几小时之前&#xff0c;吴恩达在Twitter上宣布了与OpenAI合作的最新免费教程&#xff1a;《ChatGPT Prompt Engineering for Developers》 我们可以通过下面的链接&#xff0c;直达官网网站&#xff1a; https://www.deeplearning.ai/short-courses/chatgpt-prompt-enginee…