您现在的位置是:首页 >技术交流 >Spring核心与设计思想网站首页技术交流
Spring核心与设计思想
目录
1.Spring是什么?
首先,Spring是一个容器。
- 与我们前面学习的一些容器类似,例如List、Map集合类型的数据存储容器;Tomcat这个web容器
其次,更准确的说,Spring是一个包含了众多工具方法的Ioc容器。
- 那么,究竟什么是Ioc呢?
2.Ioc——控制反转
Ioc全称 Inversion of Control,我们可以将其理解为一种“控制反转”的设计思想。它用来说明Spring是一个“控制反转容器”。那么究竟什么是控制反转呢?
所谓控制反转,指的就是 对于一组具有调用关系的上下级类,由于某个下级类发生改变时,不需要更改调用链上的代码依然能够保证程序实现指定的功能,从而进一步降低了程序的耦合度的一种设计思想。这样理解起来很抽象,我们接下来来看一个栗子:
例子:
我们创建4个类,它们之前具有上下级的创建以及调用关系,按照我们传统的开发方式,我们来试着编写下这个代码。
class A {
private B b; //维护了一个B对象
public A() {
this.b = new B();
}
public void fun() {
b.fun();
}
}
class B {
private C c; //维护了一个C对象
public B() {
this.c = new C();
}
public void fun() {
c = new C();
c.fun();
}
}
class C {
private D d; //维护了一个D对象
public C() {
this.d = new D();
}
public void fun() {
d = new D();
d.fun();
}
}
class D {
public void fun() {
System.out.println("hello,traditional");
}
}
当我们在上面的程序中创建了A对象并且调用了fun方法后能够正常输出“hello,traditional”,对象之间按照下面这种调用关系平滑的执行,似乎是没有什么问题的。
但是现在对于底层类D的fun方法,我要新增加一个参数,我们来看看会发生什么。
会发现,当我们底层类D发生上述改变后,我们需要沿着(2-1)的调用链向上依次给C类,B类,A类增加方法参数,最后在调用A类的fun参数中指定参数值完成修改。要是调用链短些还好,这种修改也不算太过分;但是,如果调用链很长呢?难道要让我们向肌肉力程序猿转型沿着几十甚至几百长的调用链重复的修改一个参数吗??
为了解决上面的这种问题,就有了我们的”控制反转“设计思想。它其实就是不再让具有调用关系的上下级类之间具有创建维护下级的动作,而是通过“注入”的方式来实现程序的进一步解耦合来实现即使下级类修改也不会过分影响上级类工作的一种思想。我们来接着上一个栗子往下看看“Ioc——控制反转”究竟是怎么做的:
class A {
private B b; //维护了一个B对象
public A(B b) {
this.b = b;
}
public void fun() {
b.fun();
}
}
class B {
private C c; //维护了一个C对象
public B(C c) {
this.c = c;
}
public void fun() {
c.fun();
}
}
class C {
private D d; //维护了一个D对象
public C(D d) {
this.d = d;
}
public void fun() {
d.fun();
}
}
class D {
public void fun() {
System.out.println("hello,traditional");
}
}
根据上面的栗子,我们可以可以发现:
传统的程序开发,调用链上类的对象的创建顺序是从上级到下级:A(B(C(D)));而采用控制反转思想改进后的类的对象的创建顺序变成了(D(C(B(A)))。我们的程序就不再将下级对象的创建权交给上级对象了,而是采用将下级对象“注入”到上级对象的方式,从而实现了:即使下层的类结构发生了变化,当前的程序调用链也是不受影响的,这就是一种典型的控制反转案例,也是Ioc思想的典型体现。
3.DI——依赖注入
如果说Ioc是一种设计思想,那么DI就是Ioc的具体实现。DI称为依赖注入,那么什么是依赖注入呢?
依赖注入指的就是在程序的运行过程中,由Ioc容器动态地将一种依赖关系“注入”到某个对象之中。就像我们上边的栗子,我们不再采用上级类创建下级类地方式,而是在程序的运行过程之中,将一种依赖关系(D、C、B对象)依次手动“注入”到(C、B、A)对象之中。
4.总结
1. Spring是什么,如何理解Spring ?
用一句话来概括,Spring就是一个包含了众多工具方法的Ioc容器。
2. Ioc和DI有什么区别?
从宏观上来讲,Ioc和DI作为一种CP版的存在,它们之间没有什么区别,都是实现程序解耦合的一种机制。如果更细分的话,可以说Ioc更多的是一种思想,DI就是Ioc这种控制反转思想的具体实现方法。
3. Spring最核心的功能是什么?
Spring最核心地功能就是:帮助我们实现了Bean对象的创建存储和取出,进行对象的管理,能够让我们在程序的运行过程中实现动态的注入关系。