在学习IOC之前我们先来看一个场景,Java中的三层架构
service层依赖dao层
UI层依赖于service层
通过上述代码我们可以发现,层层之间存在依赖关系,如果此时Dao层出现问题,编译将无法通过,此时为了解决这个问题.我们需要解除各层之间的的依赖关系.
我们发现当service层需要dao层对象时,直接主动的用new关键字来创建对象.
为了解除依赖,每一层可以将主动创建对象的权利交给Factory层,由工厂提供每一层需要的对象.这种将主动创建对象的权利交给工厂的,被动获取对象的机制,我们可以成为控制反转.
IOC是如何通过工厂层对三层架构进行解耦的呢?
此时我们需要创建一个Factory 工厂类_工厂负责从map容器中获取指定类的对象.
package com.ITheima.factory;
import javax.management.ObjectName;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
/**
* bean :可重用的组件
* javaBean :java语言写的可重用组件
* <p>
* service 依赖于dao层,ui层依赖于service层,我们要解耦
* 创建一个Bean对象的工厂:用来创建我们的的Service和dao对象的
* 1.写一个配置文件配置我们的service和dao
* 2.读取配置文件中的内容,反射创建对象
*/
public class BeanFactory {
// 定义一个Properties对象
private static Properties props;
// 定义一个map,存放要创建的对象.我们可以称它为容器
private static Map<String, Object> beans;
// 使用静态代码块为Properties对象赋值
static {
// 实例化对象
InputStream in = null;
try {
props = new Properties();
// 获取properties 文件的流对象,通过类接加载器进行获取配置文件,
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("初始化配置文件失败");
}
}
/**
* 根据bean的名称获取bean的对象
* @param beanName
* @return
*/
public static Object getBean(String beanName){
return beans.get(beanName);
}
/**
* 根据bean的名称获取bean的对象,获取的是dao层还是service层呢?
* @param beanName
* @return
*/
/*
public static Object getBean(String beanName){
Object bean =null;
try {
// 获取bean对象路径
String beanPath =props.getProperty(beanName);
// 通过反射读取bean对象,
bean=Class.forName(beanPath).newInstance();// 每次都会调用默认构造函数来创建对象
} catch (Exception e) {
e.printStackTrace();
}
return bean;
}
*/
}
创建 bean.properties 配置文件
accountService =com.ITheima.service.Impl.AccountServiceImpl
accountDao=com.ITheima.dao.impl.AccountDaoImpl
service层将主动创建对象的权利交给工厂,通过工厂被动读取dao层对象
此时大家可能对IOC有了一定的了解,IOC的存在解决了程序之间的依赖管理,降低了程序之间的耦合,接下来我们走入Spring中的IOC 的学习.