您现在的位置是:首页 >其他 >Spring 核心与设计思想网站首页其他
Spring 核心与设计思想
🌲“种一棵树最好的时间是十年前,其次是现在”
Spring 是什么?
通常所说的 Spring 指的是 Spring Framework(Spring 框架)。
Spring 是包含多种工具方法的 IoC容器。
什么是 IoC?
IoC(Inversion of Control): 控制反转
"控制反转"又是什么意思?
下面以一个程序来举例。
假如我们现在要写一个构建 Car 的程序。
实现思路是 : Car(车) -> Framework(框架) -> Bottom(底盘) -> Tire(轮胎) -> Size(轮胎尺寸)
传统程序开发
// Car 类
public class Car {
private Framework framework;
public Car(){
framework = new Framework();
}
public void init(){
System.out.println("do car");
framework.init();
}
public static void main(String[] args) {
Car car = new Car();
car.init();
}
}
// Framework 类
public class Framework {
private Bottom bottom;
public Framework(){
bottom = new Bottom();
}
public void init(){
System.out.println("do framework");
bottom.init();
}
}
// Bottom 类
public class Bottom {
private Tire tire;
public Bottom(){
tire = new Tire();
}
public void init(){
System.out.println("do bottom");
tire.init();
}
}
// Tire 类
public class Tire {
private int size = 17;
public void init(){
System.out.println("do tire");
System.out.println("size = " + size);
}
}
可以发现上述代码中 size 是写死的,如果 我想size = 另一个值,就需要改动上述代码。
// Car 类
public class Car {
private Framework framework;
public Car(int size){
framework = new Framework(size);
}
public void init(){
System.out.println("do car");
framework.init();
}
public static void main(String[] args) {
Car car = new Car(40);
car.init();
}
}
// Framework 类
public class Framework {
private Bottom bottom;
public Framework(int size){
bottom = new Bottom(size);
}
public void init(){
System.out.println("do framework");
bottom.init();
}
}
// Bottom 类
public class Bottom {
private Tire tire;
public Bottom(int size){
tire = new Tire(size);
}
public void init(){
System.out.println("do bottom");
tire.init();
}
}
// Tire 类
public class Tire {
private int size = 17;
public Tire(int size){
this.size = size;
}
public void init(){
System.out.println("do tire");
System.out.println("size = " + size);
}
}
可以看出,当最底层的代码改了之后,从下到上整个调用链的代码都要改动,这些类彼此之间的耦合程度是非常高的。
- 如何解决上述问题?
目前是在每个类中自己创建下级类,如果对下级类的参数进行修改,那么整个类也得跟着改。那我现在就不在这个类里面创建下级类了,我交给别人去创建,需要时传递(注入)就可以了。这样就完成了程序的"解耦"。
控制反转式程序开发
// Car 类
public class Car {
private Framework framework;
public Car(Framework framework){
this.framework = framework;
}
public void init(){
System.out.println("do car");
framework.init();
}
}
// Framework 类
public class Framework {
private Bottom bottom;
public Framework(Bottom bottom){
this.bottom = bottom;
}
public void init(){
System.out.println("do framework");
bottom.init();
}
}
// Bottom 类
public class Bottom {
private Tire tire;
public Bottom(Tire tire){
this.tire = tire;
}
public void init(){
System.out.println("do bottom");
tire.init();
}
}
// Tire 类
public class Tire {
private int size = 16;
private String color = "红色";
public Tire(int size,String color){
this.size = size;
this.color = color;
}
public void init(){
System.out.println("size = " + size + " | color = " + color);
}
}
// Test 类
public class Test {
public static void main(String[] args) {
Tire tire = new Tire(30,"黑色");
Bottom bottom = new Bottom(tire);
Framework framework = new Framework(bottom);
Car car = new Car(framework);
car.init();
}
}
对比总结规律:
传统代码对象创建顺序:Car -> Framework -> Bottom -> Tire
控制反转对象创建顺序:Tire -> Bottom -> Framework -> Car
回到最开始说的 Spring 的定义上:Spring 是包含多种工具方法的 IoC容器。
Spring ,作为一个 “容器”,应该具备 2 个功能 :
1.从容器中取出对象
2.把对象存入容器中。
也就是说,Spring 最核心的功能,就是从 Spring 中获取对象(Bean)和将对象存到 Spring 中。
要用这个对象,就从 Spring 中取就行了,不用了就把这个对象放回到 Spring 中。有点类似于"线程池"。
也就是把创建和销毁对象的权力交给 Spring 了。
什么是DI?
DI = Dependency Injection (依赖注入)
就是在运行 IoC 容器期间,动态的将某种依赖关系注入到对象中。
IoC 和 DI 是从不同角度,描述同一件事。引入 IoC 容器,利用 DI,最终实现解耦.
不过,IoC 更偏向于是一种"思想",DI更偏向于是一种"具体实现"。