初识IOC
一、Java Web发展史
1、第一阶段:JavaBean + Servlet + JSP 逐步发展;
2、第二阶段:面对EJB重量级框架带来的种种麻烦;
3、第三阶段:SpeingMVC/Structs + Spring + Hibernate/myBatis;
4、第四阶段:享受SpringBoot“约定大于配置”的乐趣;
5、以Dubbo为代表的SOA微服务架构体系;
6、SpringCloud微服务架构技术生态圈;
二、IoC概念
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI)
1)控制什么?
控制JavaBean对象的创建及销毁【即生命周期】
2)反转什么?
将JavaBean对象的控制权交给IoC容器【没有IoC,被依赖对象的控制权在依赖它对象处,反转就是将控制权交给IoC】
举例:人【zhangsan/Lisi】开车【Audi/Buick】回家
车:Audi.java
package com.imooc.spring.ioc.class02.stage1;
public class Audi {
public void start() {
System.out.println(this.getClass().getSimpleName() + ": 出发!!!");
}
public void turnLeft() {
System.out.println(this.getClass().getSimpleName() + ": 左转!!!");
}
public void turnRight() {
System.out.println(this.getClass().getSimpleName() + ": 右转!!!");
}
public void stop() {
System.out.println(this.getClass().getSimpleName() + ": 到达!!!");
}
}
人 Zhangsan.java
package com.imooc.spring.ioc.class02.stage1;
public class ZhangSan {
public void backHome() {
Audi audi = new Audi(); //创建车辆
audi.start(); //控制车启动
audi.turnLeft(); //控制车左转
audi.turnRight(); //控制车右转
audi.stop(); //控制车停止
}
public void gotoWork() {
Audi audi = new Audi();
audi.start();
audi.turnRight();
audi.turnLeft();
audi.stop();
}
public void gotoBuy() {
Audi audi = new Audi();
audi.start();
audi.stop();
}
}
zhangsan不仅要backhome、还要gotoWork、gotoBuy,如果zhangsan换车【Audi变为Buick则所有的都需要换】
上述代码存在问题:
1)高耦合性:zhangsan所有的行为都需要自己主动创建并销毁一辆车;
2)更换车辆代价巨大;
改进方法:将Audi这辆车提到Zhangsan的属性域里面,更换车辆只需将Audi 换为Buick
package com.imooc.spring.ioc.class02.stage2;
public class ZhangSan {
private Audi audi = new Audi(); //换车 private Buick audi = new Buick();下面不动
public void backHome() {
audi.start();
audi.turnLeft();
audi.turnRight();
audi.stop();
}
public void gotoWork() {
audi.start();
audi.turnRight();
audi.turnLeft();
audi.stop();
}
public void gotoBuy() {
audi.start();
audi.stop();
}
}
上述代码还存在问题:
1)zhangsan只是需要一辆车,与Audi或Buick无关;
2)车辆不应该由zhangsan创建
针对(1),解决方法--抽象出一个接口:car
package com.imooc.spring.ioc.class03.car;
public interface Car {
void start();
void stop();
void turnLeft();
void turnRight();
}
让Audi和Buick实现该接口
Audi:
package com.imooc.spring.ioc.class02.car;
public class Audi implements Car{
public void start() {
System.out.println(this.getClass().getSimpleName() + ": 出发 !!!");
}
public void stop() {
System.out.println(this.getClass().getSimpleName() + ": 到达 !!!");
}
public void turnLeft() {
System.out.println(this.getClass().getSimpleName() + ": 左转 !!!");
}
public void turnRight() {
System.out.println(this.getClass().getSimpleName() + ": 右转 !!!");
}
}
Buick:
package com.imooc.spring.ioc.class03.car;
public class Buick implements Car{
public void start() {
System.out.println(this.getClass().getSimpleName() + ": 出发 !!!");
}
public void stop() {
System.out.println(this.getClass().getSimpleName() + ": 到达 !!!");
}
public void turnLeft() {
System.out.println(this.getClass().getSimpleName() + ": 左转 !!!");
}
public void turnRight() {
System.out.println(this.getClass().getSimpleName() + ": 右转 !!!");
}
}
针对(2),解决方法--构造函数传递car
package com.imooc.spring.ioc.class02.stage3;
public class ZhangSan {
private Car car;
public ZhangSan(Car car){
this.car = car;
}
public void backHome() {
car.start();
car.turnLeft();
car.turnRight();
car.stop();
}
public void gotoWork() {
car.start();
car.turnRight();
car.turnLeft();
car.stop();
}
public void gotoBuy() {
car.start();
car.stop();
}
}
car由谁创建呢?--IoC容器来创建
————————————————————————————————————————————
内容来源---《Spring框架小白的蜕变》---源码