[Spring] 04 Denpendency Injection
DI Dependency Injection 依赖注入:从程序代码中移除依赖关系的一种设计模式.
这样就可以更容易地管理和测试应用程序.
DI使我们的程序编码 loosely coupled.松耦合.
为了更好地理解DI,先了解 Dependency Lookup (DL):
Dependency Lookup 是按需获得资源的一种方式.(JNDI)
缺点:
复杂,依赖,不容易测试.
依赖注入则是移除这种对于程序的依赖.
这种情况下,我们可以从外部源中获取源,比如XML文件.
这让代码松耦合,更容易测试.
写成这样:
只需要创建对象,然后是set方法和构造函数.
但是个人实际测试中,不需要构造函数.只是通过property元素创建这个对象,确实不需要.但是如果依赖此类的类通过ref attribute或者<constructor-arg><ref bean="*"/>的话,就需要相应的构造函数了.
class Employee{
Address address; Employee(Address address){
this.address=address;
}
public void setAddress(Address address){
this.address=address;
} }
这种情况下,Address的实例化由外部源(如XML文件) 提供,而不是由set方法或者构造函数完成.(个人简介:需要set方法,xml文件中的bean的name是需要和set方法对应的).
Spring框架提供两种方式来注入依赖.
构造函数
Setter方法.
--下面是构造函数的方法:
在bean元素下通过constructor-arg子元素来给构造函数传入参数进行实例化, 这样的话,要求类中的构造函数与bean的参数列表一一对应.
一种方法就是只输入value和type,让构造函数自己判断.
一种是通过index来按照顺序注入,这样会对int和string等进行自动转换.
还有一种需要使用name来指定参数名以避免混淆,比如构造函数中有两个相同类型参数的时候.
如果不指定参数类型,只有一个value,默认会调用string类型的构造函数.
----对于List<T>,使用<list>元素.
如果泛型是string类型的集合.则使用<list> <value>值</value>
如果不是string,则使用<ref bean="bean_name_1">
--对于Map<String,String>
<constructor-arg>
<map>
<entry key="Java is a Programming Language" value="Ajay Kumar"></entry>
<entry key="Java is a Platform" value="John Smith"></entry>
<entry key="Java is an Island" value="Raj Kumar"></entry>
</map>
</constructor-arg>
--对于Map<Object,Object>
<constructor-arg>
<map>
<entry key-ref="answer1" value-ref="user1"></entry>
<entry key-ref="answer2" value-ref="user2"></entry>
</map>
</constructor-arg>
---bean的继承.bean标签内加入parent属性可以继承parent bean的属性.
如果parent bean使用constructor-arg,child bean也要使用.
property同理.
--通过property子元素设置bean,就是setter方法注入.
---setter方法注入Collection<String>:
--非String 的,就是在<list>等标签间加入<ref bean=""/>
--Map<K,V>
https://www.javatpoint.com/spring-tutorial-setter-injection-with-non-string-map
-----------------------------------构造函数和setter注入的区别---------------
1.部分依赖:可以通过setter注入,但是Constructor却不行(必须有对应参数列表的constructor).
2.overriding: setting方法可以override构造函数注入. 如果我们使用两者,IOC容器会使用setter注入.
3. changes: setter注入可以很容易地改变值(并不会创建一个新的bean实例),而constructor注入会创建一个新的bean实例.
所以setter更灵活.
最新文章
- mysql优化要点(一)
- Python操作PDF与Tiff文件
- 十二 个经典 Linux 进程管理命令介绍
- golang 移动应用例子 example/basic 源码框架分析
- Codeforces Round #342 (Div. 2) B. War of the Corporations 贪心
- 重写String类,也有些区别,供参考
- Elf 32
- [置顶] Linux下文件和目录权限说明
- Printk 标志优先级别
- robotframework+seleniumlibrary自动化测试:测试环境搭建
- PHP中PDO错误/异常(PDOException)处理
- 【转】tomcat logs 目录下各日志文件的含义
- beego框架开发投票网站(1) beego基础之运行逻辑
- 【技巧】easyUI datagrid在隐藏时加载,显示时无法加载出界面
- 定时调度篇之Quartz.Net详解(被替换)
- keycloak
- python简说(一)if,for等
- Nginx 在ubuntu14.04下的安装
- hdu 5373 The shortest problem(杭电多校赛第七场)
- Java获取永久图文素材中的网页端Url
热门文章
- hdu 1151 Air Raid - 二分匹配
- Junit中AssertTrue的使用
- maven项目出现红色感叹号报错
- Visual Studio Code配置Python开发环境
- 【问题解决:Mysql操作容量限制问题】Error updating database. Cause: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (1082 >; 1024)
- 论文笔记之:DualGAN: Unsupervised Dual Learning for Image-to-Image Translation
- Unity3D学习笔记(二十七):MVC框架下的背包系统(2)
- Kubernetes相关概念
- 在 2016 年学 JavaScript 是一种什么样的体验?(React从入门到放弃)
- 提高R语言速度--转载