概述
我们先想想,开发框架是什么?我们为什么选用框架?
我们为了给用户提供服务、开发满足用户需求的软件产品,需要编写代码,把一块块砖垒起来。随着用户越来越多,开发任务也越来越重,需要快速响应形形色色的用户需求,如此反复,代码也越来越多,软件的开发和维护成本越来越大,这样快速的开发及维护日益庞大的系统成了项目组一个新的诉求。选用一款易于上手、大众、设计良好的框架,可以帮助我们较好完成模块划分、管理及交互,基于框架业务开发人员可以减少很多代码量完成同样的功能,降低代码耦合度,提高复用率,快速接入各类组件和中间件。
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中;
最后
以上就是敏感橘子为你收集整理的如何理解Spring 依赖注入的全部内容,希望文章能够帮你解决如何理解Spring 依赖注入所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复