一、本课目标
- 理解Spring IOC的定义和原理
二、什么是控制反转?
将组建对象的控制权从代码本身转移到外部容器。
- 组件化的思想是:分离关注点、使用接口、不再关注实现。
-
依赖的注入:将组件的构建和使用分开。
image.png
分析:
1、组建对象的控制权:比如说我们平时如果使用A类调用B类,则我们需要在A类里面new一个B类的对象。这样一个new的过程就是A类获得B类对象调用权的过程,那么spring的控制反转就告诉我们这样做是不可取的,然后就给我们提供了一个IOC容器,这个容器就专门用来管理对象与对象之间的关系,专门管理组件对象的控制权,然后告诉我们不要再写代码了,在外部容器里面去管理这些东西,这就实现了将组件对象的控制权从代码本身转移到外部容器。
在A类里面new一个B类对象为什么不可取?
这样写的话:
1、代码耦合性大,在级别较高的项目中,类很多,一个类可以被很多类调用,在这种情况下,如果这个类被修改了,那在那些调用这个类的类中就可能出错。
2、不方便程序的扩展。比如说B类里面封装的是mysql数据库操作的代码,如果现在不用mysql了,而用oracle,这就要求程序员了解oracle相关的知识,如果再换的话,则对程序员的要求更高,这是一个很大的问题。
2.1、工厂模式
工程模式:根据我们提供的我们所需对象示例的描述,为我们返回我们所需要的产品。包括以下几个要素:
1、产品的规范
2、产品
3、工厂
4、客户端/调用
产品的规范,也就是接口:
public interface Animal {
public void eat();
public void sport();
}
产品1:
import interf.Animal;
public class Cat implements Animal {
public void eat() {
System.out.println("猫喜欢吃鱼");
}
public void sport() {
System.out.println("猫很懒,不喜欢运动");
}
}
产品2:
import interf.Animal;
public class Dog implements Animal{
public void eat() {
System.out.println("狗喜欢吃肉");
}
public void sport() {
System.out.println("狗喜欢撒欢");
}
}
工厂:
import interf.Animal;
public class Factory {
// 定义字符串常量,负责与调用者交互
public static final String CAT="cat";
public static final String DOG="dog";
// 根据调用者传进来的描述,来返回调用者所需要的对象实例
public Animal getAnimal(String str){
if (CAT.equals(str)) {
return new Cat();
} else if (DOG.equals(str)) {
return new Dog();
} else {
return null;
}
}
}
客户端/调用者:
import interf.Animal;
import model.Factory;
import org.junit.Test;
public class FactoryTest {
@Test
public void test() {
Factory factory = new Factory();
Animal animal = null;
animal = factory.getAnimal("cat");
animal.eat();
animal.sport();
animal = factory.getAnimal("dog");
animal.eat();
animal.sport();
}
}
运行结果:
![](https://img.haomeiwen.com/i8886052/5282b34464c8a01f.png)
这就是工厂模式,我们的springIOC也是建立在工厂模式的基础上的,但是跟工程模式也有所不同:工厂模式在使用的时候还需要new一个工厂类的实例出来,而我们的springIOC就不需要写任何的代码,这是一个比工厂模式更好地地方。
三、小结
![](https://img.haomeiwen.com/i8886052/28e335d4eddbba15.png)
网友评论