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

[Spring] 04 Denpendency Injection的更多相关文章

  1. Spring之Method Injection

    对于Spring的多数用户而言,主要的Bean存在形式都是单例,当一个单例需要结合另一个单例协作或者一个非单例与另一个非单例协作时,典型的做法是通过属性的形式注入,但是当两个Bean的声明周期不同时候 ...

  2. Benefits of Using the Spring Framework Dependency Injection 依赖注入 控制反转

    小结: 1. Dependency Injection is merely one concrete example of Inversion of Control. 依赖注入是仅仅是控制反转的一个具 ...

  3. 使用Mybatis整合spring时报错Injection of autowired dependencies failed;

    这是无法自动注入,通过查找,我出错的原因在于配置文件的路径没有写对,在applicationContext.xml中是这样写的. <bean id="sqlSessionFactory ...

  4. Spring 04: IOC控制反转 + DI依赖注入

    Spring中的IOC 一种思想,两种实现方式 IOC (Inversion of Control):控制反转,是一种概念和思想,指由Spring容器完成对象创建和依赖注入 核心业务:(a)对象的创建 ...

  5. Spring → 04:Bean(1)

    一.Bean概念 Spring Bean是被实例的,组装的及被Spring 容器管理的Java对象. Spring 容器会自动完成@bean对象的实例化. 创建应用对象之间的协作关系的行为称为:装配( ...

  6. 04 Spring的@Autowired注解、@Resource注解、@Service注解

    什么是注解 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事务,这么做有两个缺点: 1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分 ...

  7. Spring重要知识点整理

    一.IOC(Inversion of Control):控制反转 (1)Spring Core最核心部分 (2)需要先了解依赖注入(Denpendency Injection)/把底层类作为参数传递给 ...

  8. spring注解源码分析--how does autowired works?

    1. 背景 注解可以减少代码的开发量,spring提供了丰富的注解功能.我们可能会被问到,spring的注解到底是什么触发的呢?今天以spring最常使用的一个注解autowired来跟踪代码,进行d ...

  9. eclipse + maven 搭建springMVC+Spring+mybatis 系统

    首先需要下载maven 安装maven插件.自行百度. 1: 创建maven系统 http://huxiaoheihei.iteye.com/blog/1766986 2:添加pom依赖: pom.x ...

随机推荐

  1. Fiddler抓取手机端(ios+android)APP接口数据(http+https)

    (1)android 环境要求: PC机和手机连接在同一网络下 工具下载地址: Fiddler网上可以下载,自行下载.注意:需要安装fiddlercertmaker(网上自行下载)进行认证 配置步骤: ...

  2. vue2.0之echarts使用

    1.首先下载echart依赖 npm install echarts --save备注:npm 安装报错时使用cnpm 2.全局注册 在main.js里引入echart并在vue中注册echart / ...

  3. bzoj 3522 / 4543 [POI 2014] Hotel - 动态规划 - 长链剖分

    题目传送门 bzoj 3522 需要root权限的传送点 bzoj 4543 快速的传送点 慢速的传送点 题目大意 给定一棵树,问有多少个无序三元组$(x, y, z)$使得这三个不同点在树上两两距离 ...

  4. docker 给运行的容器映射本地端口

    1.提交运行中的容器为一个镜像   (这样不会丢失在容器的各种操作) docker commit  tang     tang1 ###  tang(运行容器名称)   tang1(生成镜像名称) 2 ...

  5. topcoder srm 691 div1 -3

    1.给定一个$n$个顶点$n$个边的图,边是$(i,a_{i})$,顶点编号$[0,n-1]$.增加一个顶点$n$,现在选出一个顶点集$M$,对于任意的在$M$中 的顶点$x$,去掉边$(x,a_{x ...

  6. Firemonkey的几个特色属性(二)

    3.RotationAngle 控件的旋转角度,可以通过TAnimation进行角度旋转控制. 4.RotationCenter 控件旋转的中心位置,从(0,0)到(1,1),缺省是(0.5,0.5) ...

  7. strerror函数的总结【转】

    本文转载自:https://www.cnblogs.com/xrcun/p/3210889.html 定义函数:char * strerror(int errnum); 函数说明:strerror() ...

  8. repo forall -c 用法【转】

    本文转载自:https://blog.csdn.net/u010164190/article/details/78332484 .repo forall命令 # repo forall -help # ...

  9. 集训总结DAY.1(18.5.22)——KMP

    DAY 1——5.22 in the morning 依稀记得我们有一场contest. at night chf大佬讲KMP,先膜一波~~~ luoguP3375KMP模板题 KMP算法,又称模式匹 ...

  10. POJ 1679 The Unique MST 【判断最小生成树是否唯一】

    Description Given a connected undirected graph, tell if its minimum spanning tree is unique.  Defini ...