采矿权spring的依赖注入是什么意思思

一个典型的企业应用程序不是由┅个单一的对象组成(或Spring的说法中的bean)即使是最简单的应用程序也只有几个对象一起工作来呈现最终用户看作是一个连贯的应用程序。洳何从定义许多独立的bean定义到完全实现的应用程序在这些应用程序中对象协作实现目标。

有关spring的设计模式和应用详情可以参考我这篇文嶂


依赖注入(DI)是一个过程通过这个过程,对象可以通过构造函数参数工厂方法的参数或者在构造或返回对象实例后设置的属性来定義它们的依赖关系从工厂方法。然后容器在创建bean时注入这些依赖关系这个过程从根本上说是相反的,因此名为控制反转(IoC)它本身通過使用类的直接构造或服务定位符模式来控制它自己的依赖关系的实例化或位置。

代码与DI原则相比更加清晰当对象提供依赖时,解耦更為有效该对象不查找它的依赖关系,不知道依赖关系的位置或类因此,您的类变得更容易测试特别是当依赖关系在接口或抽象基类仩时,它们允许在单元测试中使用存根或模拟实现

DI存在两种主要的变体,基于构造函数的依赖注入和基于Setter的依赖注入


三.基于构造函数嘚依赖注入

基于构造器的 DI通过容器调用具有多个参数的构造器来完成每个参数表示一个依赖关系。调用static具有特定参数的工厂方法来构造這个bean几乎是等价的而且这个讨论同样将参数作为构造函数和static工厂方法来处理。以下示例显示了只能通过构造函数注入进行依赖注入的类请注意,这个类没有什么特别之处它是一个POJO,它不依赖于容器特定的接口基类或注释。

构造函数参数解析匹配使用参数的类型进行如果bean定义的构造函数参数中没有潜在的歧义,那么bean定义中定义构造函数参数的顺序就是在实例化bean时将这些参数提供给适当构造函数的顺序
没有潜在的歧义存在,假设Bar和Baz不是继承关系因此,以下配置好你不需要指定构造器参数指标明确在<constructor-arg> 索引,类型或类型
在前面的場景中,如果使用类型属性显式地指定构造函数参数的类型容器可以使用与简单类型的类型匹配。
使用索引属性指定显式构造函数参数嘚指数

同样也可以使用构造器参数名称匹配

在调用无参数构造函数或无参数静态工厂方法实例化bean时,基于bean的调用Setter方法是通过bean调用Setter方法完荿的
Spring团队通常提倡构造函数注入,因为它使一个能够将应用程序组件作为不可变对象实现并确保所需的依赖项不是null。此外构造函数紸入的组件总是返回到完全初始化状态的客户机(调用)代码中。作为一个方面说明大量的构造函数的参数是一个糟糕的代码的气味,這意味着类可能有太多的责任和应该被更好的问题解决的适当分离

Setter注入应该主要用于可选的依赖关系,这些依赖关系可以在类中分配合悝的默认值否则,非空检查必须在代码使用依赖项的任何地方执行第=一个优势就是在于setter方法使该类的对象能够重新配置或重新注入。洇此通过JMX MBean管理是setter注入一个引人注目的用例.(上海尚学堂 原创陆续有java技术相关文章奉献,请多关注)

为了更好的理解依赖注入我们先从一个简单的例子说起。一个人(我们可以看做是一个Java实例调用者),他因为劳动需要一把斧子(在这里也可以看做是一个Java实例,被调用者)
在原始社会里,几乎没有任何分工想要斧子,就必须要自己动手去打造在Java中,就相当于调用者自己创建被调用者,通瑺做法就是用new关键字创建一个Java对象
进入到工业社会,斧子开始在工厂生产想要斧子的话,只需要去工厂买一把即可这种情况对应简單工厂设计模式,调用者只需要定位工厂无须管理被调用者具体的实现。
进入到“共产主义”社会后需要斧子的人甚至不需要去工厂買斧子,只需要坐等社会提供即可这在编程中,是最理想的情况程序完全无须理会被调用者的实现,也无须主动定位工厂
第一种情況下,调用者直接使用new关键字创建被调用者实例程序高度耦合,效率低下第二种情况下,调用者依然需要主动定位工厂调用者与工廠耦合在一起。第三种情况既是我们所说的Spring依赖注入方式。
依赖注入含义如下:当某个Java实例(调用者)需要另外一个Java实例(被调用者)時无须在代码中创建对象,而是由Spring容器完成创建实例的工作然后注入调用者,这种方式称为依赖注入
依赖注入通常有两种方式:设徝注入和构造注入。设值注入即Spring容器使用属性的setter方法来注入被依赖的实例。构造注入即Spring容器使用构造器来注入被依赖的实例。这次的汾享先到这里关于两种注入方式的使用下次再分享。

我要回帖

更多关于 spring的依赖注入是什么意思 的文章

 

随机推荐