Spring——依赖注入(DI)详解
声明:本博客仅仅是一个初学者的学习记录、心得总结,其中肯定有许多错误,不具有参考价值,欢迎大佬指正,谢谢!想和我交流、一起学习、一起进步的朋友可以加我微信Liu__66666666
这是简单学习一遍之后的记录,后期还会修改。
一、概念引入
我们通过前文Spring——IOC已经知道怎么创建一个空白的实例对象,但是这个实例对象是没有进行任何成员变量设置的,都是默认值,例如int类型默认为0、引用类型默认为null。
那我们如果想创建带有特定属性的对象,那现在有个Computer类,他有属性”型号“。所以出厂的时候这个属性就是早被设定好了,那代码中的工厂如何去设置这个属性呢?其实依赖注入(DI,Dependency Injection)所做的工作就是为Spring中的Bean设置属性(成员变量的值)。
百度百科概念:所谓依赖注入,是指程序运行过程中,如果需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部的注入。Spring的依赖注入对调用者和被调用者几乎没有任何要求,完全支持对POJO之间依赖关系的管理。
二、依赖注入方式
依赖注入常见的有三种:
- 通过构造方法注入
- setter方法注入
- 接口注入
现在有苹果电脑公司的“MacBook pro 2019”型号的电脑都是“macOS Mojave”系统,那该怎么设置型号和操作系统这两个属性呢?下面我们就以这个电脑为例探讨一下!
首先建好项目并导入jar包,创建好applicationContext.xml文件,操作步骤参考Spring——IOC
项目目录结构如下:

Computer类:
public class Computer {
private String type;//电脑型号
private OperatingSystem operatingSystem;//操作系统
public Computer() {}
public Computer(String type, OperatingSystem operatingSystem) {
this.type = type;
this.operatingSystem = operatingSystem;
}
//此处略去getter setter toString方法
}
OperatingSystem类(这是Computer的一个属性:操作系统)
public class OperatingSystem {
private String name;//操作系统名字,例如Windows、macOS
//操作系统版本,例如,当name为Windows,version为10的时候,就是win10
private String version;
public OperatingSystem(){}
public OperatingSystem(String name, String version) {
this.name = name;
this.version = version;
}
//此处略去getter setter toString方法
}
1.构造方法注入(一定要写对应的构造方法!)
此方式使用的是bean标签内部的标签进行依赖注入。
以如下构造方法为例
public Computer(String type, OperatingSystem operatingSystem) {
this.type = type;
this.operatingSystem = operatingSystem;
}
- 写法1(不推荐,不常用):
<!--macOS mojave-->
<bean id="operatingSystem" class="di.OperatingSystem">
<constructor-arg index="0" value="macOS"/>
<constructor-arg index="1" value="Mojave"/>
</bean>
<bean id="computer" class="di.Computer">
<constructor-arg index="0" value="MacBook Pro 2019"/>
<constructor-arg index="1" ref="operatingSystem"/>
</bean>
标签的写法还是和之前一样,唯一不同的是有了标签体,标签体内部就是用来进行属性设置(依赖注入)的。
每个constructor-arg标签代表构造方法中的一个参数;
属性index代表参数的顺序,从0开始,index=“0”代表的是构造方法的String type这个参数,index=“1”代表的是OperatingSystem这个参数;
属性value代表的是这个参数要传入的值,例如type这个参数对应的是macOS,version是Mojave,一般来说,基本类型和String类型要用value属性来传值。
由于在Computer类中我们引用了OperatingSystem这个对象,所以需要先定义好OperatingSystem这个bean,以供我们将其注入到computer这个bean中,其实OperatingSystem就是Computer的一个依赖。而在第二个bean中,有一个ref属性,这个用来传value传不了的值,ref在本例中的值为operatingSystem这个bean的id。
- 写法2(推荐写法,但不常用):
<!--macOS mojave-->
<bean id="operatingSystem" class="di.OperatingSystem">
<constructor-arg name="name" value="macOS"/>
<constructor-arg name="version" value="Mojave"/>
</bean>
<bean id="computer" class="di.Computer">
<constructor-arg name="type" value="MacBook Pro 2019"/>
<constructor-arg name="operatingSystem" ref="operatingSystem"/>
</bean>
其他地方与写法1一样,唯一区别就是将写法1中的index属性换成了name属性,这样直接通过参数名来确定,清晰明了,不容易出错。
2.setter方法注入(一定要写好空参构造和所有属性的setter方法!!!)
此方式使用的是bean标签内部的属性进行依赖注入。
以如下构造方法为例
public Computer(String type, OperatingSystem operatingSystem) {
this.type = type;
this.operatingSystem = operatingSystem;
}
注入:
<!--macOS mojave-->
<bean id="operatingSystem" class="di.OperatingSystem">
<property name="name" value="macOS"/>
<property name="version" value="Mojave"/>
</bean>
<bean id="computer" class="di.Computer">
<property name="type" value="MacBook Pro 2019"/>
<property name="operatingSystem" ref="operatingSystem"/>
</bean>
其实与构造函数注入的第二种方式差不多,只不过是把换成了
3.接口注入(没用,不说了)
三、集合注入
注意:下文中的value标签,当需要设的值是自己定义的bean时,要用将标签替换。
为Computer类新增属性keys,表示键盘上的键的集合。
1.数组与List(可互相替换)
其实Spring中将Array和List等同起来了。
写法1(constructor-arg + array):
<bean id="computer" class="di.Computer">
<constructor-arg name="keys">
<array>
<value>a</value>
<value>b</value>
<value>c</value>
</array>
</constructor-arg>
</bean>
写法2(constructor-arg + list):
<bean id="computer" class="di.Computer">
<constructor-arg name="keys">
<list>
<value>a</value>
<value>b</value>
</list>
</constructor-arg>
</bean>
写法3(property + array):
<bean id="computer" class="di.Computer">
<property name="keys">
<array>
<value>a</value>
<value>b</value>
</array>
</property>
</bean>
写法4(property + list):
<bean id="computer" class="di.Computer">
<property name="keys">
<list>
<value>a</value>
<value>b</value>
</list>
</property>
</bean>
2.Set
写法1(constructor-arg):
<bean id="computer" class="di.Computer">
<constructor-arg name="keys">
<set>
<value>a</value>
<value>b</value>
</set>
</constructor-arg>
</bean>
写法2(property):
<bean id="computer" class="di.Computer">
<property name="keys">
<set>
<value>a</value>
<value>b</value>
</set>
</property>
</bean>
3.Map
为Computer类新增属性map<String,String> sofewares,key表示软件,value表示软件安装目录
为Computer类新增属性map<String,Singer> songs,key表示歌曲名,value表示歌手对象
写法1(property):
<bean id="singerEdSheeran" class="di.Singer">
<property name="name" value="Ed Sheeran"/>
</bean>
<bean id="computer" class="di.Computer">
<property name="softwares">
<map>
<entry key="WeChat" value="/Users/...."/>
<entry key="Intellij Idea" value="/usr/local/...."/>
</map>
</property>
<property name="songs">
<map>
<entry key="Shape of You" value-ref="singerEdSheeran"/>
<entry key="I dont care" value-ref="singerEdSheeran"/>
</map>
</property>
</bean>
写法2(将写法1的property换成constructor-arg即可)
注意,如果key或value要引用其他bean,那么对应地需要将换成或将换成
Spring——依赖注入(DI)详解的更多相关文章
- Spring 依赖注入方式详解
平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想,即依赖类不由 ...
- Spring 依赖注入方式详解(四)
IoC 简介 平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想 ...
- Unity依赖注入使用详解
写在前面 构造器注入 Dependency属性注入 InjectionMethod方法注入 非泛型注入 标识键 ContainerControlledLifetimeManager单例 Unity注册 ...
- SpringDI四种依赖注入方式详解
文章已托管到GitHub,大家可以去GitHub查看阅读,欢迎老板们前来Star!搜索关注微信公众号 [码出Offer] 领取各种学习资料! LOGO SpringDI(依赖注入) 一.DI概述 De ...
- Spring IOC 注入方式详解 附代码
引言 Spring框架作为优秀的开源框架之一,深受各大Java开发者的追捧,相信对于大家来说并不陌生,Spring之所以这么流行,少不了他的两大核心技术IOC和IOP.我们这里重点讲述Spring框架 ...
- .NET Core 中依赖注入框架详解 Autofac
本文将通过演示一个Console应用程序和一个ASP.NET Core Web应用程序来说明依赖注入框架Autofac是如何使用的 Autofac相比.NET Core原生的注入方式提供了强大的功能, ...
- AngularJS开发指南10:AngularJS依赖注入的详解
依赖注入是一种软件设计模式,用来处理代码的依赖关系. 一般来说有三种方法让函数获得它需要的依赖: 它的依赖是能被创建的,一般用new操作符就行. 能够通过全局变量查找依赖. 依赖能在需要时被导入. 前 ...
- Spring 依赖注入(DI) 的三种方式 和 对集合类型的注入
// 分别省略了getter setter public class Student { private String name; private int age; private Teacher t ...
- 依赖注入(IOC) 详解
https://blog.csdn.net/qq_27093465/article/details/52547290 https://blog.csdn.net/qq_27093465/article ...
- 1.4 Spring 依赖注入(DI)和控制反转(IOC)详解
自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取: https://www.cnblogs.com/bclshuai/p/11380657.html 1.1 Spring 依赖注 ...
随机推荐
- ansible批量自动配置Juniper
一.需求 有几台新上线的Juniper,需要批量配置下syslog,ntp,snmp基础配置 二.拓扑 三.实施步骤 1.读取配置并输出作为初步核查 2.把配置载入网络其中一台网络设备中,并做一个sh ...
- JMeter使用JSON Extractor插件实现将一个接口的JSON返回值作为下一个接口的入参
##补充## 接口响应数据,一般为JSON,HTML格式的数据. 对于HTML的响应结果提取,可以使用正则表达式,也可以通过XPath来提取:对于JSON格式的数据,可以用正则表达式,JSON Ext ...
- python 20 规范化目录
目录 规范化目录 1. 划归固定的路径: 2. 划分文件 2.1 seetings 配置文件 2.2 common 公共组件文件 2.3 src 主文件 2.4 starts 项目启动文件 2.5 类 ...
- Springboot源码分析之事务拦截和管理
摘要: 在springboot的自动装配事务里面,InfrastructureAdvisorAutoProxyCreator ,TransactionInterceptor,PlatformTrans ...
- Codeforces 1204C
题意略. 思路:我的想法是逐步地找出这个序列中的重要点,我要判断当前这个点能不能删去,就要看上一个重要点和当前这个点 i 在序列中的下一个点 i + 1之间的距离 是否是最短距离,如果是,那么我们就可 ...
- Leetcode之回溯法专题-131. 分割回文串(Palindrome Partitioning)
Leetcode之回溯法专题-131. 分割回文串(Palindrome Partitioning) 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. ...
- Sherlock之Instructions指令介绍(Sherlock Version: 7.2.5.1 64-bit)
指令集总览 1.General 1).Comment:: 注释指令. 2).Image Window: 创建新的图像窗口. True: 取像之后更新图像窗口显示:False: ...
- WebGL简易教程(三):绘制一个三角形(缓冲区对象)
目录 1. 概述 2. 示例:绘制三角形 1) HelloTriangle.html 2) HelloTriangle.js 3) 缓冲区对象 (1) 创建缓冲区对象(gl.createBuffer( ...
- MySql优化相关概念的理解笔记
MySQL架构 查询执行流程 查询执行的流程是怎样的: 连接1.1客户端发起一条Query请求,监听客户端的‘连接管理模块’接收请求1.2将请求转发到‘连接进/线程模块’1.3调用‘用户模块’来进行授 ...
- Jedis操作Redis--Hash类型
/** * Hash(哈希表) * HDEL,HEXISTS,HGET,HGETALL,HINCRBY,HINCRBYFLOAT,HKEYS,HLEN,HMGET,HMSET, HSET,HSETNX ...