Java的依赖注入(控制反转)

本文探讨了依赖注入(DI)和控制反转(IoC)的概念,解释了两者实际上是同一概念的不同称呼,并详细阐述了其在Java编程中的作用、原理及优缺点。

两个主角“依赖注入”和“控制反转”:

1、二都说的都是同一件事,只是叫法不同。是一个重要的面向对象编程的法则,也是一种设计模式

2、英文原称:依赖注入,Dependency Injection(DI);

   控制反转,Inversion of Control(IoC)。

3、作用:削减计算机程序的耦合问题

4、为什么叫“控制反转”:创建被调用者的工作不再由调用者来完成,因此称为控制反转。结合Java说,当某个Java实例需要其他Java实例时,系统自动提供一个所需要的实例,无须程序显示的new一个。所以,控制反转是,关于一个对象如何获取他所依赖的对象的引用,这个责任的反转。在有控制反转之前,是由调用者负责创建他所依赖的对象;之后,由系统负责创建。

5、为什么叫“依赖注入”:纵观所有的Java应用,它们都是由一些互相协作的对象构成的。我们称这种互相协作的关系为依赖关系。假如A组件调用了B组件的方法,我们可称A组件依赖于B组件。系统创建的实例供调用者调用,也可以看作是系统将创建的实例注入调用者。

6、优点:因为把对象生成放在了XML里定义,所以当我们需要换一个实现子类将会变成很简单(一般这样的对象都是实现于某种接口的),只要修改XML就可以了,这样我们甚至可以实现对象的热插拨(有点象USB接口和SCSI硬盘了)。

7、缺点:1)生成一个对象的步骤变复杂了(事实上操作上还是挺简单的),对于不习惯这种方式的人,会觉得有些别扭和不直观;

(2)对象生成因为是使用反射编程,在效率上有些损耗。但相对于IoC提高的维护性和灵活性来说,这点损耗是微不足道的,除非某对象的生成对效率要求特别高;

(3)缺少IDE重构操作的支持,如果在Eclipse要对类改名,那么你还需要去XML文件里手工去改了,这似乎是所有XML方式的缺憾所在。

### Java依赖注入控制反转的概念及用法 #### 什么是控制反转(IoC) 控制反转是一种设计模式,用于减少代码之间的耦合度。传统的程序开发中,组件通常会主动创建其所需的依赖项。而在使用IoC的情况下,这种行为被反转了——即不再由组件自己去获取依赖,而是由外部容器负责提供这些依赖[^1]。 #### IoC的实现机制 在Spring框架里,IoC容器承担着管理Bean生命周期以及配置它们之间相互依赖的任务。具体来说,当一个类需要另一个服务时,不是这个类自行实例化该服务,而是让Spring容器完成这项工作并将其交给请求方[^2]。 #### 依赖注入(DI)是什么? 依赖注入可以看作是实现控制反转的一种方法或手段。通过这种方式,对象不需要知道如何查找自己的协作伙伴;相反,所有的关联都由外部环境设置好之后再传递给目标对象[^3]。 #### Spring中的两种主要DI形式 - **Setter Injection (设值注入)** 这种方式允许我们定义bean属性并通过相应的setter方法来进行赋值操作。 - **Constructor-based Dependency Injection (基于构造函数的依赖注入)** 它要求我们在声明bean的时候指定所有必需参数,并通过调用对应构造器来初始化对象实例[^4]。 以下是利用Spring框架展示这两种不同类型的简单示例: ```java // Bean Class Example public class MessageService { private String message; public void setMessage(String msg){ this.message = msg; } public String getMessage(){ return this.message; } } // XML Configuration For Setter Injection <beans> <bean id="messageService" class="com.example.MessageService"> <property name="message" value="Hello World"/> </bean> </beans> // Using Constructor Argument In XML Configurations <beans> <bean id="anotherMessageService" class="com.example.AnotherMessageService"> <constructor-arg index="0" type="java.lang.String" value="Hi there!"/> </bean> </beans> ``` 以上展示了基本的应用场景,实际项目可能更加复杂但也遵循相同原则。 #### 总结 理解IoC/DI对于掌握现代Java应用架构至关重要。借助像Spring这样的强大工具库可以帮助开发者轻松处理复杂的业务逻辑而无需担心底层细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值