IoC和DI到底是什么
通过例子来讲。
没有spring之前,项目是什么样呢?
经历过一个jsp+servlet老项目的洗礼,有了点认识。
某个对象实例,里面依赖了其他类的实例,要调用实例方法。
public class Main{
public static void main(String []args){
Person jack = new Person();
//jack now need a washer to wash Clothes.
//1. 传统的new一个washer,给到jack
//2. 在jack被创建的时候,spring根据他对Waher的依赖关系
// 就已经提前创建好了一个washer
}
}
class Person{
private Washer washer;
private setWasher(Washer washer){
this.washer = washer;
}
void washClothes(){ washer.washClothes() }
}
class Washer {
void washClothes(){ System.out.println(" wash clothes") }
}
1.以往方法:程序员需要写new()。编译后的程序执行到此,才能识别并执行。
//new出来这个洗衣机对象(每次都是不同的)
washer = new Washer();
jack.setWahser(washer);
jack.washClothes();
2.用Spring:配置好。类都编译成了字节码。Spring已经提前了解到了这种依赖。
//call the spring: hey! spring! give me the washer!
//jack has already been provided a washer by spring IoC Container
jack.washClothes();
//可以在配置spring的时候,指定是重复使用一个,还是每次都不同。
控制反转Ioc(Inverse of Control)
代码上看,就是写代码的时候,程序员不用写new了。Spring将会按照配置,自动创建对象并提供对象。对象创建的控制权,就从程序员写的new,转交给了提前配置好的Spring框架。这就实现了某种意义上的控制反转。依赖注入
例子中的jack,有个Washer类实例。也就是产生了对Washer的依赖。
Spring框架通过配置文件,理解了依赖。并自动创建了对象,将依赖注入到了Person类实例jack里。这是我理解的依赖注入。
注入的不仅仅可以是某个特定的类对象。也可以是接口声明。
这个例子,当然是有不足的。模拟生活中的一个场景。
jack家里有几台washer,每台washer的洗衣程序不同。他不必关注用哪台washer。他只关注可以洗衣服就好了。
也就是应该有个WashAble接口,这个接口定义一个wash接口。实现这个接口的类,都可以有自己的wash实现。
Spring可以根据接口创建实例。