您现在的位置是:首页 >技术教程 >【Spring框架二】——什么是Spring IOC、 什么是Spring 依赖注入网站首页技术教程

【Spring框架二】——什么是Spring IOC、 什么是Spring 依赖注入

王卫——David 2024-06-17 10:32:14
简介【Spring框架二】——什么是Spring IOC、 什么是Spring 依赖注入

系列文章目录

【Spring框架一】——Spring框架简介

【Spring框架三】——Spirng IOC和DI的实现



前言

本篇博客主要讲解的是Spring 的IOC以及DI(依赖注入)的基本概念和优势利弊,如果想知道如何实现Spring IOC与DI可以访问博主的另外一篇博客。
【Spring框架三】——Spirng IOC和DI的实现


一、Spring的IOC(Inversion of Control)

1.核心思想:

它的核心思想是将对象的创建管理交给容器来完成,而不是由程序员手动创建和管理对象。

在Spring中IOC是通过Bean容器来实现的。当Spring容器启动时,会自动创建和管理一些Bean对象,并将它们放入容器中。程序员可以通过IOC容器来获取需要的Bean对象,而无须手动创建或管理对象。

2.Spring IOC与DI的关系

Spring的IOC容器通过依赖注入(Dependency Injection来完成对Bean的管理,依赖注入是指在创建Bean对象时,自动将它所依赖的对象注入到Bean中。通过依赖注入,程序员可以很方便的解耦和管理Bean对象之间的依赖关系。

3.Spring IOC容器的主要优势

在Spring中,IOC容器可以通过XML配置文件注解等方式进行配置和管理。通过IOC容器,程序员可以很方面的创建和管理对象,可以实现对象之间的松耦合,提高系统的可扩展性可维护性

在传统的编程模式中,对象之间通常是紧耦合的,即一个对象依赖另一个对象才能完成其工作。

Spring的IOC容器可以帮助我们实现对象之间的松耦合。当对象A需要使用对象B时,它不需要自己去创建对象B,而是将这个任务委托给Spring IOC容器。由Spring IOC容器负责创建和管理对象B的实例,并将其注入到对象A中。这样对象A就可以专注于自己的业务逻辑,而不必关心对象B是如何创建和管理的。这样的话,当对象B发送变化,只需要修改Spring IOC容器中对象B的定义,而不需要修改对象A的代码。这样解耦和方式可以提高应用程序的可维护性和扩展性。

代码示例

具体业务:假设有一个订单管理系统,其中包含两个服务类 OrderService 和 PaymentService。OrderService 需要调用 PaymentService 进行支付操作。

现在我们使用 Spring IOC 容器来管理这两个服务类。
首先,定义 PaymentService 接口和两个实现类 ClassB 和 NewClassB:

注意:只需要理解宏观业务,以及宏观上是通过Spring IOC和DI如何实现的,忽略细节能够更好的理解,如忽略@Service这个注解是做什么的等等。

代码如下:

public interface PaymentService {
    void pay();
}

@Service
public class ClassB implements PaymentService {
    @Override
    public void pay() {
        System.out.println("Pay with ClassB");
    }
}

@Service
public class NewClassB implements PaymentService {
    @Override
    public void pay() {
        System.out.println("Pay with NewClassB");
    }
}

然后,在 OrderService 中通过 @Autowired 注解将 PaymentService 注入进来:

代码如下:

@Service
public class OrderService {
    @Autowired
    private PaymentService paymentService;

    public void placeOrder() {
        System.out.println("Place order...");
        paymentService.pay();
    }
}

现在,如果我们想要更换支付实现方式,只需要在 Spring IOC 容器中修改 PaymentService 的定义即可,例如将 ClassB 替换为 NewClassB:

代码如下:

@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
    @Bean
    public PaymentService paymentService() {
        return new NewClassB();
    }
}

这样一来,OrderService 的代码不需要做任何修改,它仍然可以通过 Spring IOC 容器获取到 PaymentService 的实例,并调用其中的方法,以完成支付操作。这样,就可以大大降低代码的耦合性,提高代码的可维护性。

备注:对于注解的作用会再之后的Spring框架的系列博客中进行讲解。

二、使用Spring IOC容器实现对象的依赖注入的优缺点

1.优点:

  1. 对象之间的松耦合
    对象之间的依赖关系不是硬编码在代码中的,而是在 IOC 容器中通过配置来管理,从而降低了对象之间的耦合性。
  2. 对象便于管理
    IOC 容器负责对象的创建、初始化、注入和销毁等管理工作,从而让开发者可以将更多的精力放在业务逻辑的实现上,而不必关注对象的生命周期和管理。
  3. 可扩展性
    IOC 容器通过配置文件或者注解来管理对象,如果需要添加或者删除对象,只需要修改配置即可,无需修改代码,从而提高了系统的可扩展性。

2.缺点

  1. 学习成本高
    使用 Spring 的 IOC 容器需要掌握一定的 Spring 框架知识和 IOC 容器的使用方法,对于初学者来说,学习成本可能会比较高。
  2. 配置复杂
    使用 IOC 容器需要编写配置文件或者注解来描述对象之间的依赖关系,如果依赖关系比较复杂,配置文件或者注解的编写可能会比较复杂,从而增加了代码的维护难度。
  3. 运行时开销
    由于 IOC 容器需要负责对象的创建、初始化、注入和销毁等管理工作,因此在运行时会带来一定的开销,尤其是在对象比较多或者依赖比较复杂的情况下。

三、总结

目前只是对于Spring框架的IOC和DI有一个宏观的上的认识,具体如何使用Spring框架来实现IOC和DI将在后续博客进行总结和实践。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。