IOC基本原理及相关实现

IOC基本原理及相关实现

一、IOC:Inversion of Control 控制反转.

指的是 对象的创建权反转(交给)给 Spring. 作用是实现了程序的解耦合.

二、ioc(控制反转)底层原理

1、传统方式开发,原始调用类中的方法

对于如下类及其方法

1
2
3
4
5
6
public class ClassName{
//方法
public void methodName(){
//......
}
}

若要调用方法methodName(),原始的做法都是先new一个对象,再用该对象调用类中的方法,即

1
2
ClassName obj  = new ClassName();
obj.methodName();

缺陷:耦合度太高

2、利用工厂模式解耦合

工厂模式

1
2
3
public class Factory{
public static
}

3、通过IOC把对象的创建交给spring进行管理

第一步;创建xml文件
第二部: 创建工厂类(使用dom4j解析配置文件 + 反射)

1
2
3
4
//使用dom4j解析配置文件

//使用反射创建类对象
class clazz = Class.forName()

三、Spring 中的工厂

通过工厂创建bean对象
基本思路是:解析配置文件(配置文件中是类的唯一标识和全限定类名),利用反射创建实例对象,然后将该标识和获得的对象分别作 key 和 value 封装到 Map 中。
最后在静态方法中通过给定的唯一标识获取对应的 value 对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public class BeanFactory {
//定义一个Properties对象
private static Properties props;
//定义一个Map,用于存放我们要创建的对象。我们把它称之为容器
private static Map<String,Object> beans;
//使用静态代码块为Properties对象赋值
static {
try {
//实例化对象
props = new Properties();
//获取properties文件的流对象
InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
props.load(in);
//实例化容器
beans = new HashMap<String,Object>();
//取出配置文件中所有的Key
Enumeration keys = props.keys();
//遍历枚举
while (keys.hasMoreElements()){
//取出每个Key
String key = keys.nextElement().toString();
//根据key获取value
String beanPath = props.getProperty(key);
//反射创建对象
Object value = Class.forName(beanPath).newInstance();
//把key和value存入容器中
beans.put(key,value);
}
}catch(Exception e){
throw new ExceptionInInitializerError("初始化properties失败!");
}
}

/**
* 根据bean的名称获取对象
* @param beanName
* @return
*/
public static Object getBean(String beanName){
return beans.get(beanName);
}

比如,bean.properties如下:
userDao 和 userService 是所提供的对象id标识,可根据个人喜好随意命名
gavino.spring.dao.impl.UserDaoImpl 和 gavino.spring.service.impl.UserServiceImpl 是类的全限定类名。

1
2
userDao=gavino.spring.dao.impl.UserDaoImpl
userService=gavino.spring.service.impl.UserServiceImpl

四、DI :Dependency Injection

依赖注入.需要有 IOC 的环境,Spring 创建这个类的过程中,Spring 将类的依赖的属性设置进去。

# spring

评论