您现在的位置是:首页 >技术交流 >Spring-IoC网站首页技术交流
Spring-IoC
Spring的介绍
框架:大佬把一基本操作进行封装;就好比自定义http服务器封装性很差劲;所以我们就使用servlet;这也是一个框架。Servlet到Spring如同骑几十年自行车的你;突然发现还有电瓶车这种好东西。
spring:包含众多工具和方法的IoC容器。
IoC容器:Inversion of Control;控制反转的容器。spring是一个控制反转的容器。
举例:什么的控制反转
比如A程序依赖B程序;那么A就控制着B程序的生命周期;我们在创建A的时候就得实现B;然后如果B发送改变后;比如参数变化;那我A的程序也得跟着变化。耦合高了。
实现一个生产汽车的示例:
public class Car {
public void init(){
System.out.println("do car");
// 车的使用要依赖车身
Framework framework=new Framework();
framework.init();
}
public static void main(String[] args) {
Car car=new Car();
// 新建一个车 ;使用这个车
car.init();
}
}
class Framework {
public void init(){
System.out.println("do Framework");
// 车身的使用要依赖底部
Bottom bottom=new Bottom();
bottom.init();
}
}
class Bottom {
public void init() {
System.out.println("do Bottom");
// 底部的使用要依赖车轮
Tire tire=new Tire();
tire.init();
}
}
class Tire {
public int size=17;
// 车轮的长度只能固定
public void init(){
System.out.println("size->"+size);
}
}
这个示例的依赖关系非常紧密;当我们想在不同场景使用不同尺寸轮胎;那就挺难办的。Tire的init方法加个参数size;那这个参数来自用户;就得经过车、车身、车底把这参数传过来。我们四个类的代码都要修改。如果还有演示、大小等等属性我们自己去控制这些依赖就很难办。
IoC:转移控制权。生命周期就变成别人的;控制权反转。
package newcar;
public class Car {
public Framework framework;
public Car(Framework framework){
this.framework=framework;
}
public void init() {
System.out.println("do car...");
framework.init();
}
}
class Framework {
public Bottom bottom;
public Framework(Bottom bottom) {
this.bottom = bottom;
}
public void init() {
System.out.println("do framework...");
bottom.init();
}
}
class Bottom {
private Tire tire;
public Bottom(Tire tire) {
this.tire = tire;
}
public void init() {
System.out.println("do bottom...");
tire.init();
}
}
class Tire {
private int size = 17;
private String color = "红色";
public Tire(int size, String color) {
this.size = size;
}
public void init() {
System.out.println("size -> " + size + " | color -> " + color);
}
}
修改后的代码以参数的形式拿到它的依赖类;很好的实现解耦。
如果是spring框架;依赖生命周期等的管理就交给第三方;IoC的用途是解耦;但不局限于。IoC是一种思想;把控制权交给别人管理。
传统的建车:先建车;发现要依赖车身;那就建车身;依赖车底建车底;依赖车轮就建车轮。
IoC的思想:先建好车轮(想要什么尺寸就建什么尺寸)再建车底;车身;车。
容器:
spring这个Ioc容器的作用:将对象存和取;bean对象;类对象。对象的创建和销毁都交给spring;这个容器也有储存和获取对象的能力。
解耦的同时还能提高效率;就跟要的工具我已经事先储存在容器里;而不是要用的时候才创建。还能帮你解决死锁;循环依赖的问题。
(让我们更偏向使用权;而不是拥有权;比如共享汽车。我不需要关注;保养;年新;保险;停在哪;轮胎不行;或者机油;刹车油不行都得换等等;停车费也不便宜;很多麻烦事。在家停也得要钱;就回老家;下雨的时候开。停车费。租车;有专门停放共享汽车的地。保险费也得花费不少。)
总结:spring Ioc优点
1:解耦
2:使用更加方便(比如我要车身;你给我给车身我就能造车;不需要关注后面的依赖情况)
3:高效;默认单例;跟线程池一样;只创建一次。除了第一次;事先创建好;后面就可以直接使用;而不是要用的时候再创建。
DI
DI:依赖注入;将依赖的某个对象拿到当前类当中(底层是先是动态代理;动态代理底层是反射)
IoC相当于是一种思想;而DI是一种具体的实现;DI是一种主动获取对象的方式。传参数;被动的;得别人传给你;你才能接收。主动是我自己主动获取。