【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将在后续博客进行总结和实践。


目录
相关文章
|
3月前
|
安全 Java Ruby
我尝试了所有后端框架 — — 这就是为什么只有 Spring Boot 幸存下来
作者回顾后端开发历程,指出多数框架在生产环境中难堪重负。相比之下,Spring Boot凭借内置安全、稳定扩展、完善生态和企业级支持,成为构建高可用系统的首选,真正经受住了时间与规模的考验。
293 2
|
2月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
4月前
|
XML JSON Java
Spring框架中常见注解的使用规则与最佳实践
本文介绍了Spring框架中常见注解的使用规则与最佳实践,重点对比了URL参数与表单参数的区别,并详细说明了@RequestParam、@PathVariable、@RequestBody等注解的应用场景。同时通过表格和案例分析,帮助开发者正确选择参数绑定方式,避免常见误区,提升代码的可读性与安全性。
|
2月前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
2月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
143 8
|
3月前
|
监控 Kubernetes Cloud Native
Spring Batch 批处理框架技术详解与实践指南
本文档全面介绍 Spring Batch 批处理框架的核心架构、关键组件和实际应用场景。作为 Spring 生态系统中专门处理大规模数据批处理的框架,Spring Batch 为企业级批处理作业提供了可靠的解决方案。本文将深入探讨其作业流程、组件模型、错误处理机制、性能优化策略以及与现代云原生环境的集成方式,帮助开发者构建高效、稳定的批处理系统。
434 1
|
10月前
|
XML Java 测试技术
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
727 26
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
|
XML Java 数据格式
Spring5系列学习文章分享---第一篇(概述+特点+IOC原理+IOC并操作之bean的XML管理操作)
Spring5系列学习文章分享---第一篇(概述+特点+IOC原理+IOC并操作之bean的XML管理操作)
129 1
|
XML druid Java
Spring5系列学习文章分享---第二篇(IOC的bean管理factory+Bean作用域与生命周期+自动装配+基于注解管理+外部属性管理之druid)
Spring5系列学习文章分享---第二篇(IOC的bean管理factory+Bean作用域与生命周期+自动装配+基于注解管理+外部属性管理之druid)
202 0

热门文章

最新文章