Spring 控制反转与依赖注入

简介: Spring 控制反转与依赖注入

控制反转(IoC)与依赖注入(DI)是密切相关的概念,它们通常一起出现在讨论Spring框架时。

控制反转

控制反转(IoC) 是一种设计原则,它将对象的创建和管理权交给容器,而不是由对象自身来完成。传统的程序设计中,对象间的依赖关系是由对象自己进行管理和创建的,而通过IoC,这种依赖关系的控制被反转了,即由容器来管理和控制对象之间的依赖关系。

控制:对于成员变量赋值的控制权

控制反转:把对于成员变量赋值的控制权,从代码中反转(转移)到Spring⼯⼚和配置⽂件中完成

好处:解耦合

底层实现:⼯⼚设计模式

image.png


依赖注入


依赖注入(DI) 是 IoC 的一种实现方式,它是指容器在创建对象时,动态地将该对象所依赖的其他对象的引用注入到该对象中。这样就实现了对象之间的解耦,提高了灵活性和可测试性。


注⼊:通过Spring的⼯⼚及配置⽂件,为对象(bean,组件)的成员变量赋值


依赖注⼊:当⼀个类需要另⼀个类时,就意味着依赖,⼀旦出现依赖,就可以把另⼀个类作为本类的成员变量,最终通过Spring配置⽂件进⾏注⼊(赋值)。


好处:解耦合

image.png

因此,控制反转(IoC)强调的是控制权的转移,而依赖注入(DI)则强调的是依赖关系的注入。在Spring框架中,我们使用IoC容器来管理对象的生命周期,并通过依赖注入的方式来实现对象之间的解耦和管理依赖关系。


总的来说,控制反转是一种设计原则,依赖注入是实现这一设计原则的具体方式。在Spring框架中,通过控制反转和依赖注入,我们能够更好地管理应用程序中的对象并实现对象之间的松耦合,从而提高了应用程序的灵活性和可维护性。

举例

我们可以通过一个简单的 Java 代码段来说明它们的基本用法。以下是一个基于 Spring 框架的示例代码:


假设我们有一个 UserService 接口和其实现类 UserServiceImpl,它依赖于 UserDao 接口。我们可以通过Spring框架实现依赖注入,让容器来管理对象之间的依赖关系。

// UserDao接口
public interface UserDao {
    void saveUser(String username);
}

// UserService接口
public interface UserService {
    void saveUser(String username);
}

// UserService的实现类UserServiceImpl,依赖于UserDao
public class UserServiceImpl implements UserService {
    private UserDao userDao;

    // 通过构造函数注入依赖
    public UserServiceImpl(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public void saveUser(String username) {
        // 调用UserDao来保存用户
        userDao.saveUser(username);
    }
}

接下来,我们可以通过 Spring 的配置文件(或注解)来配置依赖注入,告诉 Spring 容器如何实例化和注入对象。以下是一个简单的 Spring 配置文件示例:

<!-- applicationContext.xml -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 配置UserDao的实现类 -->
    <bean id="userDao" class="com.example.UserDaoImpl" />

    <!-- 配置UserServiceImpl,并注入UserDao -->
    <bean id="userService" class="com.example.UserServiceImpl">
        <constructor-arg ref="userDao" />
    </bean>
</beans>

在这个示例中,我们使用 Spring 的配置文件来定义 UserDao 和 UserServiceImpl 的实现类,并将UserDao 注入到 UserServiceImpl 中。当 Spring 容器启动时,它会根据配置文件来创建相应的对象,并自动进行依赖注入。


这样,我们就通过控制反转和依赖注入的方式,实现了对象之间的解耦和管理依赖关系。


总结

我们可以进一步探讨它们的实际应用和优势。


松耦合:通过IoC和DI,对象之间的依赖关系变得更加松散。对象不再需要直接创建或查找它们所依赖的对象,而是让容器来管理这些依赖关系。这使得对象的复用性更强,也更容易进行单元测试和模块化开发。


灵活性:IoC和DI使得系统更加灵活。通过配置文件或注解,我们可以很容易地改变对象之间的依赖关系,甚至在不修改代码的情况下,就能够改变应用程序的行为。


可维护性:通过IoC容器管理对象的生命周期,我们能够更好地跟踪和管理对象的创建和销毁过程,从而提高了代码的可维护性和可读性。


测试:IoC和DI使得单元测试变得更加容易。我们可以使用模拟对象(mock object)来替代真实的依赖对象,从而更好地进行单元测试。


降低复杂性:IoC和DI降低了应用程序的复杂性。因为它们将对象的创建和依赖关系管理交由容器来完成,程序员可以更专注于业务逻辑的实现,而不必过多关注对象的创建和管理。

IoC和DI是一种非常有益的编程模式,在现代的应用开发中被广泛应用。通过这种模式,我们能够更好地管理对象之间的依赖关系,提高了代码的灵活性、可测试性和可维护性。在Spring框架中,IoC和DI被作为核心特性,为开发者提供了强大的编程模型和便利的开发方式。


相关文章
|
8天前
|
开发框架 Java Spring
Spring依赖注入以及使用建议
Spring依赖注入以及使用建议
36 0
|
8天前
|
XML Java 数据格式
Spring系列文章2:基于xml方式依赖注入
Spring系列文章2:基于xml方式依赖注入
|
8天前
|
XML Java 程序员
Spring的依赖注入
Spring的依赖注入
|
8天前
|
Java Spring
Spring5深入浅出篇:Spring中ioc(控制反转)与DI(依赖注入)
Spring5深入浅出篇:Spring中ioc(控制反转)与DI(依赖注入)
|
8天前
|
Java API Spring
Spring6-IoC(Inversion of Control)控制反转和DI(Dependency Injection)依赖注入,手动实现IOC
Spring6-IoC(Inversion of Control)控制反转和DI(Dependency Injection)依赖注入,手动实现IOC
|
8天前
|
Java 测试技术 开发者
Spring IoC容器通过依赖注入机制实现控制反转
【4月更文挑战第30天】Spring IoC容器通过依赖注入机制实现控制反转
22 0
|
8天前
|
Java 数据库连接 API
【Spring】1、Spring 框架的基本使用【读取配置文件、IoC、依赖注入的几种方式、FactoryBean】
【Spring】1、Spring 框架的基本使用【读取配置文件、IoC、依赖注入的几种方式、FactoryBean】
60 0
|
8天前
|
XML Java 程序员
Spring特性之二——IOC控制反转
Spring特性之二——IOC控制反转
17 4
|
8天前
|
存储 缓存 Java
【Spring系列笔记】依赖注入,循环依赖以及三级缓存
依赖注入: 是指通过外部配置,将依赖关系注入到对象中。依赖注入有四种主要方式:构造器注入、setter方法注入、接口注入以及注解注入。其中注解注入在开发中最为常见,因为其使用便捷以及可维护性强;构造器注入为官方推荐,可注入不可变对象以及解决循环依赖问题。本文基于依赖注入方式引出循环依赖以及三层缓存的底层原理,以及代码的实现方式。
24 0
|
8天前
|
XML 设计模式 Java
依赖注入艺术:探索Spring如何实现松耦合的神奇
依赖注入艺术:探索Spring如何实现松耦合的神奇
39 0
依赖注入艺术:探索Spring如何实现松耦合的神奇