建设网站费用分析,济宁市中网站建设,营销方案设计,网站建设的格式Spring 是什么#xff1f;
我们通常所说的 Spring 指的是 Spring Framework#xff08;Spring 框架#xff09;#xff0c;它是⼀个开源框架#xff0c;有着活跃而庞大的社区#xff0c;这就是它之所以能长久不衰的原因。Spring 支持广泛的应⽤场景#xff0c;它可以让…Spring 是什么
我们通常所说的 Spring 指的是 Spring FrameworkSpring 框架它是⼀个开源框架有着活跃而庞大的社区这就是它之所以能长久不衰的原因。Spring 支持广泛的应⽤场景它可以让 Java 企业级的应⽤程序开发起来更简单。 ⽤⼀句话概括 SpringSpring 是包含了众多工具方法的 IoC 容器。 那问题来了什么是容器什么是 IoC 容器接下来我们⼀起来看。
什么是容器
容器是⽤来容纳某种物品的基本装置。 ——来⾃百度百科 我们想想之前课程我们接触的容器有哪些 List/Map - 数据存储容器 Tomcat - Web 容器 比如一个web光有一个web的话是运行不起来的你得需要把这个web放到toncat这个web容器上才能运行起来
什么是 IoC
Spring 也是⼀个容器Spring 是什么容器呢Spring 是⼀个 IoC 容器 什么是 IoC IoC Inversion of Control 翻译成中⽂是“控制反转”的意思也就是说 Spring 是⼀个“控制反转”的容器由于这个“控制翻转”是英文直译过来的有一些差别实际上叫做控制权翻转 怎么理解这句话呢 比如我们传统的java创建对象的方式是new一个新对象这个对象的生命周期由我们程序员当前代码来控制的因此我们就有了这个对象的控制权什么是翻转呢就是这个对象由被我们控制变成不被我们控制了而是交给spring也可以叫spring容器/IoC容器来控制了交给spring控制之后我们不需要自己再new一个新对象了只需要告诉spring我们要一个对象它就会给我们一个 因此控制权翻转可以理解为对象的生命周期不由程序员或当前代码片段来控制而是由spring也可以叫spring容器/IoC容器来控制了
为什么要用IoC
IoC优点可以实现解耦合松耦合
假如我们现在构建⼀辆“⻋”的程序我们的实现思路是这样的 构建⼀辆⻋Car Class然⽽⻋需要依赖⻋身(FrameWork Class)⽽⻋身需要依赖底盘BottomClass⽽底盘需要依赖轮胎Tire Class最终程序的实现代码如下:
public class NewCarExample {public static void main(String[] args) {Car car new Car();car.init();}/*** 汽⻋对象*/static class Car {public void init() {// 依赖⻋身Framework framework new Framework();framework.init();}}/*** ⻋身类*/static class Framework {public void init() {// 依赖底盘Bottom bottom new Bottom();bottom.init();}}/*** 底盘类*/static class Bottom {public void init() {// 依赖轮胎Tire tire new Tire();tire.init();}}/*** 轮胎类*/static class Tire{// 尺⼨private int size 30;public void init() {System.out.println(轮胎尺⼨ size);}}
}以上程序中轮胎的尺⼨的固定的然⽽随着对的⻋的需求量越来越⼤个性化需求也会越来越多这时候我们就需要加⼯多种尺⼨的轮胎那这个时候就要对上⾯的程序进⾏修改了修改后的代码如下所示:
public class NewCarUpdateExample {public static void main(String[] args) {Car car new Car(20);car.init();}/*** 汽⻋对象*/static class Car {private Framework framework;public Car(int size) {framework new Framework(size);}public void init() {// 依赖⻋身framework.init();}}/*** ⻋身类*/static class Framework {private Bottom bottom;public Framework(int size) {bottom new Bottom(size);}public void init() {// 依赖底盘bottom.init();}}/*** 底盘类*/static class Bottom {private Tire tire;public Bottom(int size) {tire new Tire(size);}public void init() {// 依赖轮胎tire.init();}}/*** 轮胎类*/static class Tire {// 尺⼨private int size;public Tire(int size) {this.size size;}public void init() {System.out.println(轮胎尺⼨ size);}}
}从以上代码可以看出以上程序的问题是当最底层代码改动之后整个调用链上的所有代码都需要修改 如何解决上述问题呢 我们可以尝试不在每个类中自己创建下级类如果自己创建下级类就会出现当下级类发⽣改变操作自己也要跟着修改。 此时我们只需要将原来由自己创建的下级类改为传递的方式也就是注入的方式因为我们不需要在当前类中创建下级类了所以下级类即使发生变化创建或减少参数当前类本身也无需修改任何代码这样就完成了程序的解耦 PS解耦指的是解决了代码的耦合性耦合性也可以换⼀种叫法叫程序相关性。好的程序代码的耦合性代码之间的相关性是很低的也就是代码之间要实现解耦。 这就好⽐我们打造⼀辆完整的汽车如果所有的配件都是自己造那么当客户需求发生改变的时候比如轮胎的尺寸不再是原来的尺寸了那我们要自己动⼿来改了但如果我们是把轮胎外包出去那么即使是轮胎的尺寸发⽣变变了我们只需要向代理工厂下订单就行了我们自身是不需要出⼒的。 基于以上思路我们把调⽤汽⻋的程序示例改造⼀下把创建⼦类的⽅式改为注⼊传递的⽅式具体实现代码如下
public class IocCarExample {public static void main(String[] args) {//以下四行是模拟spring ioc容器Tire tire new Tire(20);Bottom bottom new Bottom(tire);Framework framework new Framework(bottom);Car car new Car(framework);car.run();}static class Car {private Framework framework;public Car(Framework framework) {this.framework framework;}public void run() {framework.init();}}static class Framework {private Bottom bottom;public Framework(Bottom bottom) {this.bottom bottom;}public void init() {bottom.init();}}static class Bottom {private Tire tire;public Bottom(Tire tire) {this.tire tire;}public void init() {tire.init();}}static class Tire {private int size;public Tire(int size) {this.size size;}public void init() {System.out.println(轮胎 size);}}
}代码经过以上调整⽆论底层类如何变化整个调⽤链是不⽤做任何改变的这样就完成了代码之间的解耦从⽽实现了更加灵活、通⽤的程序设计了
在传统的代码中对象创建顺序是Car - Framework - Bottom - Tire 改进之后解耦的代码的对象创建顺序是Tire - Bottom - Framework - Car 我们发现了⼀个规律通⽤程序的实现代码类的创建顺序是反的传统代码是 Car 控制并创建了FrameworkFramework 创建并创建了 Bottom依次往下⽽改进之后的控制权发⽣的反转不再是上级对象创建并控制下级对象了⽽是下级对象把注⼊将当前对象中下级的控制权不再由上级类控制了这样即使下级类发⽣任何改变当前类都是不受影响的这就是典型的控制反转也就是 IoC 的实现思想。 既然 Spring 是⼀个 IoC控制反转容器重点还在“容器”⼆字上那么它就具备两个最基础的功能 将对象存⼊到容器 从容器中取出对象。 也就是说学 Spring 最核心的功能就是学如何将对象存⼊到 Spring 中再从 Spring 中获取对象的过程。IoC容器管理的资源的是对象对象在ioc的叫法叫Bean 将对象存放到容器中的好处将对象存储在 IoC 容器相当于将以后可能⽤的所有⼯具制作好都放到仓库中需要的时候直接取就⾏了⽤完再把它放回到仓库。⽽ new 对象的⽅式相当于每次需要⼯具了才现做⽤完就扔掉了也不会保存下次再⽤的时候还得重新做这就是 IoC 容器和普通程序开发的区别。 Spring 是⼀个 IoC 容器说的是对象的创建和销毁的权利都交给 Spring 来管理了它本身⼜具备了存储对象和获取对象的能⼒。
DI概念说明
说到 IoC 不得不提的⼀个词就是“DI”DI 是 Dependency Injection 的缩写翻译成中⽂是“依赖注入”的意思。 所谓依赖注⼊就是由 IoC 容器在运⾏期间动态地将某种依赖关系注⼊到对象之中。所以依赖注⼊DI和控制反转IoC是从不同的⻆度的描述的同⼀件事情就是指通过引⼊ IoC 容器利⽤依赖关系注⼊的⽅式实现对象之间的解耦 IoC 是“目标”也是⼀种思想而目标和思想只是⼀种指导原则最终还是要有可行的落地方案而 DI就属于具体的实现。 比如说我今天心情比较好吃⼀顿好的犒劳犒劳自己那么“吃⼀顿好的”是思想和目标是 IoC但最后我是吃海底捞还是杨国福这就是具体的实现就是 DI 怎么理解动态地将某种依赖关系注⼊到对象之中 这句话呢 看下图 比如我在运行car类的时候需要用到Framework这个类现在我运行car了ioc容器就知道我依赖的是framework这个对象于是就可以在运行时候动态的把容器里的framework对象给car类里的framework对象这样用到framework对象的时候就不至于是空指针异常了