控制反转和依赖注入

本文解析了Spring框架中的两大核心概念:控制反转(IoC)与依赖注入(DI)。通过实例说明了它们如何降低代码间的耦合度并提高程序的灵活性。

    上篇博客简单介绍了Spring的一些优点,现在来说一下Spring这些优点实现的基础:控制反转和依赖注入。

控制反转

    IoC(Inversion of Control),我们可以把它理解为面向对象编程的一个名词概念。直白的说,就是:本来是你该控制的事,现在交由其他人控制,即权利或责任的反转。在编程中,常见的实例是,A对象需要依赖B对象(在A中new一个B),本该是A控制这个过程,现在交由系统处理,这种做法的优势是A与B的耦合性降低;如果这种依赖关系可以控制,也提高了程序的灵活性。

依赖注入

    DI(Dependency Injection),控制反转是一个概念,如何什么手段实现?依赖注入是一个靠谱的方案,依赖注入的主要实现靠的是反射和面向接口编程,常见的如:

UserDao userDao=new userDao4Mysql();

    依赖注入,就是把这个实例化的过程分为两步:

  • 第一步:UserDao userDao;
  • 第二步:userDao=new userDao4Mysql();
    然后将第二步分离出来,写入到XML文件中,再使用反射原理将new出来的userDao4Mysql对象注入。这一步可以有两种做法:构造函数和setter。

    XML

    将使用到的userDao注入到UserManagerImpl中。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	     xmlns:aop="http://www.springframework.org/schema/aop"
	     xmlns:tx="http://www.springframework.org/schema/tx"
	     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
	<bean id="userDaoMysql" class="com.tgb.spring.dao.UserDao4MysqlImpl"/>
	
	<bean id="userDaoOracle" class="com.tgb.spring.dao.UserDao4OracleImpl"/>
	
	<bean id="userManager" class="com.tgb.spring.manager.UserManagerImpl">
		<property name="userDao" ref="userDao4Mysql"/>
	</bean>
</beans>

    构造函数方式

public class UserManagerImpl implements UserManager {

	private UserDao userDao;
	
	public UserManagerImpl(UserDao userDao){
		this.userDao=userDao;
	}

}

    Set方式

public class UserManagerImpl implements UserManager {

	private UserDao userDao;
	
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}

}

总结

    如上所见,耦合性降低同时灵活性提升:

  • 耦合性降低体现在UserManagerImpl不必再直接关联UserDao4MysqlImpl。
  • 灵活体现在userDao4Mysql在配置文件中,可按需要修改,如替换为UserDao4OracleImpl。

    以上说的是优点,那么缺点呢?

  • 手写XML易产生拼写错误。
  • 反射本身生成对象会有一些效率问题(一倍多于直接new)。

   以上就是Spring的核心控制反转和依赖注入,下篇博客会说到Spring与Struts1的集成。

### 控制反转依赖注入的概念 控制反转(Inversion of Control, IoC)是一种设计原则,用于降低软件模块之间的耦合度。其核心思想是将程序的控制流从传统的主程序调用子程序的方式转变为由框架或容器来管理程序的流程[^1]。在这种模式下,应用程序不再直接负责创建管理对象及其依赖关系,而是将这些职责交给外部容器来处理。 依赖注入(Dependency Injection, DI)是实现控制反转的一种具体技术手段。它通过将对象的依赖项作为参数传递给对象,而不是在对象内部直接实例化这些依赖项,从而实现解耦。这种方式使得代码更加灵活,易于测试维护[^2]。 ### 控制反转依赖注入的区别 控制反转是一个更广泛的概念,而依赖注入是实现控制反转的一种方法。控制反转可以通过多种方式实现,例如事件驱动编程、模板方法模式等,但依赖注入是最常见的一种实现方式[^1]。 - **控制反转**:是一种设计原则,强调的是将程序的控制权转移给外部容器。 - **依赖注入**:是一种具体的实现技术,用于实现控制反转,强调的是通过外部注入的方式来解决对象之间的依赖关系。 ### 依赖注入的实现原理 依赖注入的实现通常涉及一个容器(IoC容器),该容器负责创建对象并管理它们的生命周期依赖关系。容器会根据配置信息(如XML文件或注解)来决定如何创建组装对象。常见的依赖注入方式包括构造函数注入、设值注入接口注入[^3]。 #### 构造函数注入 构造函数注入是通过构造函数来传递依赖对象。这种方式的优点是可以在对象创建时就确保所有必需的依赖都已经被提供。 ```java public class Service { private final Dependency dependency; public Service(Dependency dependency) { this.dependency = dependency; } } ``` #### 设值注入 设值注入是通过setter方法来设置依赖对象。这种方式的优点是可以动态地改变依赖对象。 ```java public class Service { private Dependency dependency; public void setDependency(Dependency dependency) { this.dependency = dependency; } } ``` #### 接口注入 接口注入要求被注入的对象必须实现某个特定的接口,该接口定义了注入的方法。 ```java public interface Injectable { void injectDependency(Dependency dependency); } public class Service implements Injectable { private Dependency dependency; @Override public void injectDependency(Dependency dependency) { this.dependency = dependency; } } ``` ### 总结 控制反转依赖注入都是为了提高软件系统的可扩展性可测试性,降低组件间的耦合度。控制反转是一种设计原则,而依赖注入是实现这一原则的具体技术之一。依赖注入通过外部容器来管理对象的创建依赖关系的注入,从而实现了控制反转的目标。
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值