3. IOC容器概念及原理
3.1 演变过程
普通方式–>工厂模式实现–>IOC过程
3.2 普通方式:
在使用相应类的地方new一个新对象,然后调用其相应的方法进行使用。
**缺点:**耦合度过高,如先前service层中创建Dao实现类,如果xxxDaoImpl位置发生改变,所有的使用到相应实现类的代码都需要进行修改,工作量大。
3.3 工厂模式实现:
通过创建一个xxxFactory类,在类中存在一个方法专门用来生成对象
public class xxxFactory{
public static 返回类型 getXXX(){
return new xxx();
}
}
**优点:**如果实现类或类的位置发生了变化,那么service中的代码无需变动,只需要修改xxxFactory中的import导入依赖时的类的路径即可,相比第一种方式减轻了修改量,但是仍有一些不足。
**缺点:**如果类路径发生变化,那么需要在xxxFactory中修改相应的import位置,无法实现代码的对修改关闭原则(开闭原则)
3.4 IOC方式
通过修改,将修改限定在xml配置文件内部,xxxFactory类,与使用这个对象的类中的代码都无需修改。、
**具体实现过程:**①在xml配置文件中作相应的配置(类的全类名、读取时的key)
②在xxxFactory中首先通过Dom4j等相应的xml解析依赖,对xml配置文件进行解析,然后读取其中与对象创建有关的bean标签,其中的id为创建的对象的key,然后创建一个对象,将其作为value调用put方法写入即可(采用Map实现)
class xxxFactory{
public static void getXXX(){
String classValue = class属性值; //通过xml解析出来
String id = id属性值;
Class clazz = Class.forName(classValue);
map.put(id,(XXX类型)clazz.newInstance);
return;
}
}
**优点:**①如果类路径发生了改变,只需要在配置文件中修改即可,不需要改动代码中的内容
②具体实现是通过map,将解析出来的id作为map的key,value中填入反射创建出来的对象即可
getBean方法的本质就是通过id取value值的一种操作,值的内容通过泛型来转换。
3.5 什么是IOC
- (1)控制反转,把对象创建和对象之间的调用过程,交给 Spring 进行管理
- (2)使用 IOC 目的:为了耦合度降低
- (3)做入门案例就是 IOC 实现
3.6 IOC接口(常用)
1、IOC思想基于IOC容器完成,IOC容器的底层原理就是对象工厂
2、Spring提供的IOC容器实现方式:两个接口
**① BeanFactory接口:**IOC 容器基本实现,是 Spring 内部的使用接口,不提供开发人员进行使用 , 加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象
注:具体是否加载对象貌似是由lazy-init属性来决定,与接口无关(未确定)
② ApplicationContext接口:BeanFactory 接口的子接口,提供更多更强大的功能,一般由开发人 员进行使用
- 加载配置文件时候就会把在配置文件对象进行创建
3、ApplicationContext接口实现类
FileSystemXmlApplicationContext:加载系统文件路径
ClassPathXmlApplicationContext:加载src路径