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

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

系列文章目录

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

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


什么是Spring IOC 什么是Spring 依赖注入


前言

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

2.缺点

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

三、总结

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


目录
相关文章
|
6天前
|
XML Java 测试技术
spring复习01,IOC的思想和第一个spring程序helloWorld
Spring框架中IOC(控制反转)的思想和实现,通过一个简单的例子展示了如何通过IOC容器管理对象依赖,从而提高代码的灵活性和可维护性。
spring复习01,IOC的思想和第一个spring程序helloWorld
|
3天前
|
缓存 Java Spring
手写Spring Ioc 循环依赖底层源码剖析
在Spring框架中,IoC(控制反转)是一个核心特性,它通过依赖注入(DI)实现了对象间的解耦。然而,在实际开发中,循环依赖是一个常见的问题。
13 4
|
9天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
527 5
|
7天前
|
XML Java 开发者
经典面试---spring IOC容器的核心实现原理
作为一名拥有十年研发经验的工程师,对Spring框架尤其是其IOC(Inversion of Control,控制反转)容器的核心实现原理有着深入的理解。
29 3
|
7天前
|
XML 前端开发 Java
控制spring框架注解介绍
控制spring框架注解介绍
|
7天前
|
存储 NoSQL Java
Spring Session框架
Spring Session 是一个用于在分布式环境中管理会话的框架,旨在解决传统基于 Servlet 容器的会话管理在集群和云环境中的局限性。它通过将用户会话数据存储在外部介质(如数据库或 Redis)中,实现了会话数据的跨服务器共享,提高了应用的可扩展性和性能。Spring Session 提供了无缝集成 Spring 框架的 API,支持会话过期策略、并发控制等功能,使开发者能够轻松实现高可用的会话管理。
Spring Session框架
|
14天前
|
机器学习/深度学习 数据采集 JavaScript
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
ADR药品不良反应监测系统是一款智能化工具,用于监测和分析药品不良反应。该系统通过收集和分析病历、处方及实验室数据,快速识别潜在不良反应,提升用药安全性。系统采用Java开发,基于SpringBoot框架,前端使用Vue,具备数据采集、清洗、分析等功能模块,并能生成监测报告辅助医务人员决策。通过集成多种数据源并运用机器学习算法,系统可自动预警药品不良反应,有效减少药害事故,保障公众健康。
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
|
11月前
|
Java Spring
spring框架之AOP模块(面向切面),附带通知类型---超详细介绍
spring框架之AOP模块(面向切面),附带通知类型---超详细介绍
93 0
|
11月前
|
缓存 监控 Java
Spring框架之AOP(面向切面编程)
Spring框架之AOP(面向切面编程)
48 0
|
3月前
|
分布式计算 Java MaxCompute
详解 Java 限流接口实现问题之在Spring框架中使用AOP来实现基于注解的限流问题如何解决
详解 Java 限流接口实现问题之在Spring框架中使用AOP来实现基于注解的限流问题如何解决
下一篇
无影云桌面