一、定义
什么是IOC? IOC是指把对象的创建交给Spring来管理的方式。它有两种方式:一种是配置文件;另一种是注解。
二、IOC底层原理
IOC的实现主要依赖于下面四种技术:
1)XML配置文件
2)dom4j解析XML
3)工厂设计模式
4)反射
下面讲解一下IOC的演变过程。
stage1(原始方式)
//现在有一个类及类方法
public class User {
public void add() {
...
}
}
//现在要在Servlet里调用类里面的方法
User user = new User();
user.add();
缺点: 耦合度太高,类或者方法一旦有所改变,需要改动Servlet里面的多处代码
stage2(使用工厂类)
public class UserService {
public void add() {
...
}
}
//创建工厂类
public class Factory {
public static UserService getService() {
return new UserService();
}
}
//调用
public class UserServlet() {
UserService s = Factory.getService();
s.add();
}
缺点: Servlet与Factory仍旧有一定耦合性
stage3(IOC解决方式)
1)第一步。创建配置文件
<bean id="userService" class="cn/.../UserService"/>
class属性表示类的全路径
2)第二步。创建工厂类,使用dom4j解析配置文件
public class UserFactory(){
public static UserService getService(){
// 1.使用dom4j解析配置文件,根据id值得到对应的class属性值
String classValue = "class属性值";
// 2.使用反射创建类对象
class clazz = class.forName(classValue);
UserService service = clazz.newInstance();
return service;
}
}
优点: 如果类发生变化,只需要修改配置文件
三、使用举例
在Spring中使用IOC可以分为以下四步。
stage1:导入jar包
1)解压spring-framework的zip文件,在bin目录下,每个jar包都有三个文件,分别是jar包、文档和源代码;
2)使用spring最基本的功能,只需导入beans、core、context、expression四个最核心的jar包就可以了;
3)导入支持日志输出的jar包,如logging、log4j等。
stage2:创建类并在类里面创建方法
package cn.itcast.ioc;
public class User {
public void add(){
System.out.println("add...");
}
}
stage3:创建配置文件并配置创建类
1)spring核心配置文件的名称和位置不是固定的。建议放到src下面,官方建议名称为applicationContext.xml;
2)引入schema约束。对于4.x版本的spring来说:
- 找到docs/spring-framework-reference/html下面的最后一个文件
- 用浏览器打开这个文件,找到文件末尾一段代码。复制前半部分到xml文件,这就叫做引入约束
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
3)配置对象创建
<bean id="user" class="cn.itcast.ioc.User"></bean>
stage4:测试
public class TestIOC{
public void testUser(){
// 1.加载spring配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
// 2.得到配置创建的对象
User user = (User)context.getBean("user");
...
}
}