文章目录
一、IOC的概念和原理
1.什么是IOC
- 控制反转:IOC,翻译过来就是控制反转,就是把对象创建和对象之间的调用过程都交给Spring进行管理。
- 目的:降低耦合
2.IOC的底层原理
技术支持:xml解析、工厂模式(设计模式的一种)、反射
(1)工厂模式
假设有两个类,UserService类和UserDao类,我们想要在UserService中调用一个UserDao的方法,传统做法如下。这样的弊端就是,类之间的耦合度高。
class UserService{
execute(){
UserDao userDao=new UserDao();
userDao.add();
}
class UserDao{
add(){
}
}
如果采用工厂模式,如下,耦合度有所降低,但工厂类和UserDao类依旧存在耦合。
class UserService{
execute(){
UserDao userDao=UserFactory.getDao();
userDao.add();
}
class UserDao{
add(){
}
}
class UserFactory{//用这个类统一创建对象
public static UserDao getDao(){
return new UserDao();
}
}
(2)IOC的解耦过程
为了进一步将耦合度降到最低限度,我们在利用了xml解析、工厂模式、反射的原理基础上,引入了IOC技术。
步骤如下:
- 在xml文件中配置创建的对象
<bean id="dao" class="com.wang.UserDao"></bean>
- 已有Service类和Dao类,现在要创建工厂类
class UserFactory{
public static UserDao getDao(){
String classValue=class属性值;//通过xml解析获取class属性值,这一步还需要展开
Class class=Class.forName(classValue);//通过反射创建对象
return (UserDao)class.newInstance();//完成了反射创建对象
}
}
(3)IOC接口
IOC思想基于IOC容器完成,IOC容器底层就是对象工厂。
Spring中提供IOC容器两种实现方式:
- BeanFactory接口:IOC容器最基本的方式(Spring自带的),一般只内部使用,不提供我们这些开发人员使用。特点是:加载配置文件时不会创建对象,而是获取对象、使用对象时才创建对象。
BeanFactory context=new ClassPathXmlApplicationContext("bean1.xml");
- ApplicationContext接口:是BeanFactory的子接口,功能更强大,是推荐使用的。特点是:加载配置文件时(启动服务器时)就创建对象。
ApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml");
- BeanFactory接口下面还有一个ConfigurableApplicationContext子接口,有一些扩展的功能,可以了解一下。
(4)ApplicationContext接口的实现类
- FileSystemXmlApplicationContext类:参数为xml文件的绝对路径
- ClassPathXmlApplicationContext类:参数为xml文件的项目相对路径