如何理解Spring 依赖注入

2 篇文章 0 订阅
 我们先想想,开发框架是什么?我们为什么选用框架?

我们为了给用户提供服务、开发满足用户需求的软件产品,需要编写代码,把一块块砖垒起来。随着用户越来越多,开发任务也越来越重,需要快速响应形形色色的用户需求,如此反复,代码也越来越多,软件的开发和维护成本越来越大,这样快速的开发及维护日益庞大的系统成了项目组一个新的诉求。选用一款易于上手、大众、设计良好的框架,可以帮助我们较好完成模块划分、管理及交互,基于框架业务开发人员可以减少很多代码量完成同样的功能,降低代码耦合度,提高复用率,快速接入各类组件和中间件。

 Spring依赖注入(DI,Dependency Injection)可以自动识别带有特定标识的bean放在自己的容器中,并且完成依赖bean的自动装配。通过Spring的依赖注入,代码可以:
  • 避免紧耦合,使代码具有可测性

  • 提高复用率,注入的bean都是单例的

  • 灵活装配任意依赖类的子类

    看个具体例子,Class B 依赖于 Class A,代码如下:

public class A {
   public A () {
     // init
   }
}

public class B {
   private A a;
   
   public B () {
       this.a = new A();
   }
}

B 强依赖于A, 造成B一旦初始化,其私有属性A难以改变,在单测时也难以mock,为了使B中的A可以自由装配,可以采用构造函数设置或set方法设置:
构造函数设置

public class B {
   private A a;
   
   public B (A a) {
       this.a = a;
   }
}

set方法设置:

public class B {
   private A a;
   
   public void setA (A a) {
       this.a = a;
   }
}

那传入B的A值是从哪来呢?Spring就基于构造函数设置和set方法设置提供了构造函数注入和set方法注入两种注入方式实现B中A的装配。参数A是Spring容器自动管理的,用户只需要按照Spring约定声明类A的bean及B对A的依赖即可。

类C也依赖于A,则C依赖的类A可以是与B依赖的A是同一个(甚至全局唯一)的beanA,可以是A类不同的bean。

public class C {
   private A a;
   
   public void setA (A a) {
       this.a = a;
   }
}

对于A的子类AChild,也可以被注入到类B和类C中。

public class AChild extend A {
   
}

通过事例理解,Spring的依赖注入实现了:

  • 类B和类C对类A可以通过构造方法或设置方法定制类A,耦合度度降低,方便将类A的mock类注入到类B/C中,使类B/C具有可测性;
  • 类A可以是全局唯一的bean被注入到类B/C中;
  • 类A的子类AChild也可以被装配到类B/C中;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值