IOC,它是Inverse of Control的缩写,中文含义是控制反转,表示将对象的创建权力反转给Spring框架!!
IOC解决的问题:使用IOC可以解决的程序耦合性高的问题!!
那么什么是程序的耦合呢?
所谓的耦合:就是代码和与代码之间产生了依赖,有一种牵一发而动全身的感觉;
ioc 的控制反转的原理,本来我们所创建的对象是需要我们自己独自new的,但是ioc所依赖并不是这样的,而是通过配置,在配置中配置出我们想要创建的对象的路径,然后,通过dom4j技术将我们的xml配置文件给解析出来,通过反射技术,创建对应的对象
bean.xml配置
<?xml version="1.0" encoding="UTF-8" ?>
<bean id="userDao" class="cn.itchen.dao.impl.UserDaoImpl"></bean>
factory工厂类
public class BeanFactory {
// 定义一个map集合来存放工厂反射生成的对象
/*
* 这里的方法必须是静态的方法,不然静态代码快里面就不能调用的;
* */
private static Map<String, Object> map = new HashMap<>();
// dom4j解析xml对象
static {
// 创建解析配置文件的对象
SAXReader sax = new SAXReader();
// 获取对应的字节输入流对象将它作为参数传递到给sax进行读取
InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("beans.xml");
try {
// 读取之后成为了一个文档对象;
Document document = sax.read(in);
// 获取xml文档对象的根节点
Element root = document.getRootElement();
// 根据根节点进行获取的id和class的字符串的
String id = root.attributeValue("id");
String clazz = root.attributeValue("class");
// 通过反射生成对象
Object object = Class.forName(clazz).newInstance();
// 获取之后需要一个容器来存储,我们就选择了map容器,所以我们在外面定义了map的容器来存取,然后在下面进行键取值
map.put(id, object);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Object createUserDao(String id) {
// 根据键取值
Object object = map.get(id);
return object;
}
}
获取UserDao的对象
public class UserServiceImpl implements UserService {
private UserDao userDao = (UserDao) BeanFactory.createUserDao("userDao");
@Override
public void saveUser() {
userDao.save();
}
}