Spring——依赖注入(DI)详解
声明:本博客仅仅是一个初学者的学习记录、心得总结,其中肯定有许多错误,不具有参考价值,欢迎大佬指正,谢谢!想和我交流、一起学习、一起进步的朋友可以加我微信Liu__66666666
这是简单学习一遍之后的记录,后期还会修改。
一、概念引入
小说网 https://www.guxs.net/
我们通过前文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的时候,就是win10private 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依赖注入原理详解(转载)
spring依赖注入原理详解----转载 所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中.当spring容器启动后,spring容器初始化,创建并管理bean对象,以及销毁它.所 ...
- 控制反转(IoC)与依赖注入(DI)详解
文章目录 什么是控制反转(IoC) 控制反转(IoC)有什么作用 控制反转(IoC)是怎么分类的 依赖注入 接口注入 Setter方法注入 构造器注入 依赖查找 上下文依赖查找(Contextuali ...
- Spring 依赖注入方式详解
平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想,即依赖类不由 ...
- spring依赖注入原理详解
所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中.当spring容器启动后,spring容器初始化,创建并管理bean对象,以及销毁它.所以我们只需从容器直接获取Bean对象就行, ...
- Spring的注入方式详解
[html] view plaincopy Spring的注入方式详解 Spring有三个注入方式,type1,type2,type3 type1 接口依赖 type2 setter/getter ...
- Spring依赖注入DI
DI是Dependency Injection的缩写,依赖注入的意思,依赖了Spring容器,进行set注入,这里还是以一个例子进行阐述 首先我们创建两个实体类 package com.zhiying ...
- Android神匕首—Dagger2依赖注入框架详解
简介 Dagger-匕首,鼎鼎大名的Square公司旗下又一把利刃(没错!还有一把黄油刀,唤作ButterKnife) Dagger2 是一个Android依赖注入框架,由谷歌开发,最早的版本Dagg ...
- 依赖注入Dagger2详解
为什么使用依赖注入 首先我们需要知道,人们在很长的一段时间里都是利用控制反转原则规定:应用程序的流程取决于在程序运行时对象图的建立.通过抽象定义的对象交互可以实现这样的动态流程.而使用依赖注入技术或者 ...
- Android hilt 依赖注入使用详解
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/128424833 本文出自[赵彦军的博客] 文章目录 官方文档 作用域于树图 添加依 ...
- golang 依赖注入 dig详解
golang的依赖注入dig 一篇文章带你了解golang依赖注入 dig介绍: dig 库是一个为 go 提供依赖注入 (dependency injection) 的工具包,基于 reflecti ...
最新文章
- 朱毅麟:为什么用户接收机定位需要接收4颗导航卫星的信号?
- 【Linux】28.Linux脚本判断是否安装了某软件
- nginx+keepalived互为主主高可用配置
- MFC动态链接库的制作步骤和使用方法
- matlab函数每天进步一点点
- 1.22 OSS旧IP下线公告
- LeetCode 5376. 非递增顺序的最小子序列
- 【数据结构和算法】拓扑排序(附leetcode题 207/210 课程表)
- Atitit 管理原理与实践attilax总结
- linux系统vmd软件如何使用,科学网—VMD (linux下分子可视化软件) - 刘雪静的博文...
- AI语音外呼机器人是如何帮助电销行业获客?
- ENVI监督分类中SVM(支持向量机)工具
- 服务器封包协议号,DHCP协议的租约确认和封包格式
- [CyanogenMOD移植教程] 前言:什么是CyanogenMod
- 转:CEO, CFO, CIO, CTO, CSO是什么
- 短距离无线通信之蓝牙模块
- 【转】 机器学习入门——浅谈神经网络
- js 判断两个时间相差多少月_js对日期操作 获取两个日期的相差是否在几月之内...
- C语言实现实数和复数矩阵及其各种运算(一)
- 【ELK报错】Alias [.kibana] has more than one indices associated with it [[.kibana_1, .kibana_2]]
热门文章
- web项目tomcat jdk 一起打包
- 网易视频云:七夕送书 | 单身狗福利!你想看的,这里都有!
- 桌面排版神器:Affinity Publisher for Mac(1.10.0.1115)
- 【Python】Jupyter .ipynb
- Python 对列表进行排序
- zoom会议启用等候室会怎样,安排zoom会议一直通讯中
- Linux 服务器(二)-linux安装方法之Centos安装介绍——Windows中制作USB启动盘 MacOS中制作USB启动盘
- 线路/信道编码技术(2)——64B/66B编码
- python3串口通信模块pyserial
- php怎么设置文字环绕图片,使用CSS实现文字环绕图片效果