微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

自定义IOC

自定义ioc

1.IOC

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码间的耦合度

控制反转,对象的使用者不是创建者 .

2.原始方式

特点:创建累,根据类自己new对象

优点:易写,简洁

缺点:耦合度太高,不方便维护

3.面向接口

特点:创建接口(规则),根据接口编写实现类(可以是多个),根据实现类自己new对象. 对象不使用实现类接收了, 用接口(多态)

好处: 规范了. 相对原始方式 好维护了一点

缺点: 多写了接口, 还是改了源码

4.IOC

特点: 创建接口(规则), 根据接口编写实现类(可以是多个). 编写配置文件, 使用工厂模式创建对象出来. 要使用的话直接从工厂里面获得, 不再自己创建了

好处: 解耦了, 不需要修改源码

缺点: 多写了配置文件

自定义IOC代码实现:

1.配置xml文件:

<?xml version = "1.0" encoding = "utf-8"?>
<beans>
    <!--id属性: 作为bean的唯一标识, 随便写的 不要重复就好了【一般写接口/类名, 首字母小写】
        class属性: 类的全限定名
    -->
    <bean id="userDao" class="com.donjor.dao.impl.UserDaoImplMyBatis"></bean>
    <bean id="userService" class="com.donjor.service.impl.UserServiceImpl"></bean>
</beans>

2.创建Bean工厂

package com.donjor.utils;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Description: 创建Bean的工厂
 * 【问题】:
 * 1.每次getBean()都需要解析一次xml
 * 2.每次getBean()都是最后临时反射创建一个对象返回
 * 【解决】
 * 1.xml只需要解析一次, 解析xml代码定义在静态代码块里面
 * 2.程序初始化的时候, 就解析xml 把所有bean创建好,存到一个容器(集合). getBean()时候就直接从容器里面取
 * 【容器】
 * 1.容器选择Map
 * 2.把id作为map的键, 把id对应的bean对象作为map的值
 */
public class beanfactory {

    //容器
    private static Map<String, Object> beanMap = new HashMap<String, Object>();

    static {
        InputStream is = null;
        try {
            //1.解析xml 获得所有的bean标签List
            //1.1 创建SAXReader对象
            SAXReader saxReader = new SAXReader();
            //1.2 读取xml 获得document对象
            is = beanfactoryOri.class.getClassLoader().getResourceAsstream("applicationContext.xml");
            Document document = saxReader.read(is);
            List<Element> beanEles = document.selectNodes("//bean");
            //2.遍历所有的bean标签List
            for (Element beanEle : beanEles) {
                //3.获得bean标签的id和class
                String id = beanEle.attributeValue("id");
                String className = beanEle.attributeValue("class");
                //4.根据class反射创建对象, 把id作为key,把对象作为value存到beanMap
                Object obj = Class.forName(className).newInstance();
                beanMap.put(id, obj);
            }
        } catch (Exception e) {
            e.printstacktrace();
        }finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printstacktrace();
            }
        }
    }

    /**
     * 根据id获得对应的Bean对象
     *
     * @param id
     * @return
     */
    public static Object getBean(String id) {  //eg: userDao
        return beanMap.get(id);
    }
}

通过自定义的Bean工厂,就实现了控制反转,对象的使用者不是创建者 .

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。