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更灵活.

最新文章

  1. mysql优化要点(一)
  2. Python操作PDF与Tiff文件
  3. 十二 个经典 Linux 进程管理命令介绍
  4. golang 移动应用例子 example/basic 源码框架分析
  5. Codeforces Round #342 (Div. 2) B. War of the Corporations 贪心
  6. 重写String类,也有些区别,供参考
  7. Elf 32
  8. [置顶] Linux下文件和目录权限说明
  9. Printk 标志优先级别
  10. robotframework+seleniumlibrary自动化测试:测试环境搭建
  11. PHP中PDO错误/异常(PDOException)处理
  12. 【转】tomcat logs 目录下各日志文件的含义
  13. beego框架开发投票网站(1) beego基础之运行逻辑
  14. 【技巧】easyUI datagrid在隐藏时加载,显示时无法加载出界面
  15. 定时调度篇之Quartz.Net详解(被替换)
  16. keycloak
  17. python简说(一)if,for等
  18. Nginx 在ubuntu14.04下的安装
  19. hdu 5373 The shortest problem(杭电多校赛第七场)
  20. Java获取永久图文素材中的网页端Url

热门文章

  1. hdu 1151 Air Raid - 二分匹配
  2. Junit中AssertTrue的使用
  3. maven项目出现红色感叹号报错
  4. Visual Studio Code配置Python开发环境
  5. 【问题解决:Mysql操作容量限制问题】Error updating database. Cause: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (1082 &gt; 1024)
  6. 论文笔记之:DualGAN: Unsupervised Dual Learning for Image-to-Image Translation
  7. Unity3D学习笔记(二十七):MVC框架下的背包系统(2)
  8. Kubernetes相关概念
  9. 在 2016 年学 JavaScript 是一种什么样的体验?(React从入门到放弃)
  10. 提高R语言速度--转载