【JavaEE】Spring + IoC + DI
目录
Spring概念
IoC
DI
Spring概念
Spring是包含众多工具方法的IoC容器。
IoC
IoC:Inversion of Control 控制权反转
它是一种思想,是面向对象的一种设计原则。这种思想为了实现类与类之间的解耦。
比如当一个对象要使用另一个对象时,不再需要创建出来,而是直接从其他地方拿就 行。
Spring IoC:
是Spring框架的核心功能之一。它是一种设计模式,把对象的创建和管理的控制权反转给 容器。
核心操作:存对象,取对象
优点:解耦
使用方便,不再需要手动创建了,而是直接使用即可。
更加高效。
Spring IoC是IoC思想中的具体实现,
通过以下的代码来理解IoC:
当前我们想简单的实现一辆车:由车身、底盘和轮胎组成。其中车身依赖底盘,底盘依赖轮胎。
// 车
public class Car {// 车身private Body body;public Car() {body = new Body();}public void init() {System.out.println("车身造好了!");body.init();}
}
// 车身
public class Body {// 底盘private Bottom bottom;public Body() {bottom = new Bottom();}public void init() {System.out.println("底盘造好了!");bottom.init();}
}
// 底盘
public class Bottom {// 轮胎private Wheel wheel;public Bottom() {wheel = new Wheel();}public void init() {System.out.println("轮胎造好了!");wheel.init();}
}
// 轮子
public class Wheel {// 轮子大小统一为 15寸private int size = 15;public void init() {System.out.println("size : " + this.size);}
}
// 测试车
public class TestCar {public static void main(String[] args) {Car car = new Car();car.init();}
}
当轮胎尺寸大小固定不变的时候,这个代码正常运行。但是当要改变轮胎大小的时候,此时就会出现一个麻烦的事情:当轮胎变了,依赖轮胎的底盘要变,依赖底盘的车身要变,从而导致从下到上都要改动。修改部分代码如下:
由于每个类之间都是层层依赖的关系,并且都是本类创建出所需的类,然后使用。这就导致了,所有的代码都要大改动。而有了IoC的思想后,每个类对于所要使用的类,仅仅停留在使用阶段,不需要自己创建,直接从拿到注入给所需的类即可。修改代码如下:
// 轮子
public class Wheel {private int size = 15;public Wheel(int size) {this.size = size;}public void init() {System.out.println("size : " + this.size);}
}
// 底盘
public class Bottom {private Wheel wheel;// 这里不是通过new来创建出轮胎,而是直接给底盘使用
// 这里可以看成从Spring容器中直接取(注入),但这不是Spring代码,可以看成这样的思想
// 后面的代码也都是这样改的public Bottom(Wheel wheel) {this.wheel = wheel;}public void init() {System.out.println("轮胎造好了!");wheel.init();}
}
// 车身
public class Body {private Bottom bottom;public Body(Bottom bottom) {this.bottom = bottom;}public void init() {System.out.println("底盘造好了!");bottom.init();}
}
// 车
public class NewCar {private Body body;public NewCar(Body body) {this.body = body;}public void init() {System.out.println("车身造好了!");body.init();}
}
public class TestNewCar {public static void main(String[] args) {
// 这里目前写起来是非常复杂的,如果是Spring项目的话,
// 存储了这些对象后,想拿到是很简单的Wheel wheel = new Wheel(18);Bottom bottom = new Bottom(wheel);Body body = new Body(bottom);NewCar newCar = new NewCar(body);newCar.init();}
}
DI
Dependence Injection 注入依赖
上面提到了IoC,它是一种反转控制权思想,而DI则是它的实现方式。
它从Spring容器中取出已经注册的对象,比如上面的车身、底盘和轮胎,哪个类需要,直接从容器中取出使用即可。
在Spring框架中,DI通过@Autowire注解、构造函数注入、Setter方法注入等方式来实现。其中,@Autowire注解是最常用的方式,它可以自动装配对象,并且可以根据类型、名称、注解等条件进行注入。
有什么错误评论区指出。希望可以帮到你。