用一个简单的例子说明:为什么Spring/IoC能降低耦合度

为什么IoC能降低耦合度

spring框架是java最广为人知的IoC容器实现之一

在学习spring的时候就经常说能够解耦增强灵活性什么的,但是其实一直不太理解为什么能,不就是不用自己写new了吗,怎么就解耦了

本文就用于一个简单的例子来解释一下

IoC

首先快速了解一下什么是Ioc:

这是我自己的理解:

就是把创建对象实例的过程,交给别的类来统一进行

用spring举例就是,由

Person person=new Person();

变成了

@Autowired
Person person;

以下都是比较专业的解释:

在Java中,IoC(Inversion of Control,控制反转)是一种设计原则和编程模式,它旨在提高软件系统的可扩展性和可维护性,通过减少代码间的紧耦合关系。

核心概念

控制反转意味着将对象的创建、初始化、装配(即依赖关系的管理)等控制权从应用程序代码中转移到一个专门的容器(如Spring框架)中。原本由应用程序直接控制的部分,现在交由外部容器负责。这种“反转”体现在:

  • 责任转移:对象(就是你当前写代码的类)不再自行创建或查找依赖对象(就是你写代码时要调用到的其他类),而是由容器在运行时自动提供所需依赖。
  • 依赖透明:对象无需了解依赖对象的具体实现细节,只需声明它们需要哪些接口或类型。
  • 解耦合:对象之间的依赖关系在配置层面(如XML配置文件、注解或Java配置类)中指定,而不是硬编码在源代码中。

实现方式

在Java中,IoC最常通过依赖注入(Dependency Injection,DI)技术来实现。依赖注入有以下几种形式:

  • 构造器注入:容器通过调用带有参数的构造函数来创建对象,并传入依赖对象。
  • setter方法注入:容器通过调用对象的setter方法(属性设置方法)来注入依赖对象。
  • 字段注入:在某些框架中,容器可以直接通过反射设置对象的私有字段来注入依赖。

为什么Ioc就能解耦

还是用spring,举一个实际的例子进行解释

场景

假如一个类Student,要使用的Person类

一个类Teacher,也要使用Person类

Person类一个实现类PersonEarth,这个是目前正在使用的实现类

Person类还有另一个实现类PersonAlien

传统的方式:

public class Student {
    private Person Person;
    public Student() {
        this.person = new PersonEarth(); // 直接创建依赖对象
    }
}
public class Teacher {
    private Person Person;
    public Teacher() {
        this.person = new PersonEarth(); // 直接创建依赖对象
    }
}

spring的方式:

public class Student {
    private Person person;
    @Autowired
    public Student(Person person) {
        this.person = person;
    }
}
public class Teacher {
    private Person person;
    @Autowired
    public Teacher(Person person) {
        this.person = person;
    }
}


// 配置文件或Java配置类
@Configuration
public class AppConfig {
    @Bean
    public Person person() {
        return new PersonEarth();
    }
}
//也可以不写配置类,直接在PersonEarth类上加注解@Component

场景发生了变化,两种方式如何应对

此时如果我们想要把Person的实现方式改为使用PersonAlien

那么对于传统方式,需要分别修改Student和Teacher中的new后边的代码

而对于IoC的方式,仅需要修改配置类中使用的实现类,或者在PersonAlien类上加注解即可

总结

当使用Person的类越来越多时,IoC的优势就越明显(只需要修改一个地方)

由此可见IoC相比传统的方式确实能够进行解耦

当然IoC或者Spring拥有更加多的优势,本文只是通过一个简单的例子让我们能够真正相信IoC相比较传统的方式是能够解耦的

  • 13
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值