手写模仿Spring容器

零星的过去,如同地上破碎的玻璃,每一个闪耀放光的个体,都在说着过去完整的自己。。。。

show code ! ! !

DAO层

public interface Dao {
    public void dao();
}
public class DaoImpl implements Dao {
    @Override
    public void dao() {
        System.out.println("dao");
    }
}

Service 层

public interface Service {
    public void service();
}
public class ServiceImpl implements Service {

    private Dao dao;

    @Override
    public void service() {
        dao.dao();
        System.out.println("services");
    }
}

简单的IOC容器

/**
 * @Auther: 罗罗
 * @Description:
 */
public class BeanFactory {

    private Map map = new HashMap<String,Object>();

    public Object getBean(String beanName) {
        return map.get(beanName);
    }

    public BeanFactory(String xml) throws Exception{
        pasingXML(xml);
    }

    //解析xml文件
    private void pasingXML(String xml) throws Exception{
        SAXReader saxReader = new SAXReader();
        Document document = null;
        Object o = null;
        boolean flag = false;
        try {
            document = saxReader.read(BeanFactory.class.getClassLoader().getResourceAsStream(xml));
            Element rootElement = document.getRootElement();

            String autowire = rootElement.attributeValue("default-autowire");
            if (autowire!=null){
                //自动装配:type name
                //xml没有属性property
                flag = true;
            }

            Iterator<Element> iterator = rootElement.elementIterator();
            while (iterator.hasNext()){
                //注册类进入容器
                Element firstElement = iterator.next();
                String id = firstElement.attributeValue("id");
                String className = firstElement.attributeValue("class");
                Class<?> clazz = Class.forName(className);

                //维护类的依赖关系
                Iterator<Element> secondElement = firstElement.elementIterator();
                if (!secondElement.hasNext()){
                    o = clazz.newInstance();
                }
                while (secondElement.hasNext()){
                    Element element = secondElement.next();
                    if (element.getName().equals("property")){
                        //property
                        o = clazz.newInstance();
                        String propertyName = element.attributeValue("name");
                        String refVal = element.attributeValue("ref");
                        Object injectObj = map.get(refVal);
                        Field field = clazz.getDeclaredField(propertyName);
                        field.setAccessible(true);
                        field.set(o,injectObj);
                    }else {
                        //构造器
                        String refVal = element.attributeValue("ref");
                        Object injectObj = map.get(refVal);
                        Constructor<?> constructor = clazz.getConstructor(injectObj.getClass());
                        constructor.setAccessible(true);
                        o = constructor.newInstance(injectObj);
                    }
                }
                map.put(id,o);

                if (flag){
                    //1.先查找依赖
                    Object o1 = map.get(id);
                    Field[] fields = o1.getClass().getDeclaredFields();
                    //遍历map,查找类型相同的bean个数
                    Set keySet = map.keySet();
                    int count = 0;
                    for (Object key : keySet) {
                        Class<?> aClass = map.get(key).getClass();
                        for (Field field : fields) {
                            Class<?> anInterface = aClass.getInterfaces()[0];
                            if ( field.getType().getName().equals(aClass.getInterfaces()[0].getName())){
                                count++;
                                field.setAccessible(true);
                                field.set(o1,aClass.newInstance());
                            }
                        }
                    }
                    //2.注入,判断数量,报错
                    if (count>1){
                        throw new MacherException("需要一个bean,但是找到了两个");
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

测试Setter

public class Test01 {
    public static void main(String[] args) {
        BeanFactory beanFactory = new BeanFactory("spring.xml");
        Service service = (Service) beanFactory.getBean("service");
        service.service();
    }
}

结果

"C:\Program Files\Java\jdk1.8.0_144\bin\java.exe" "-javaagent:D:\IntelliJ IDEA\IntelliJ IDEA 2018.2.4\lib\idea_rt.jar=55916:D:\IntelliJ IDEA\IntelliJ IDEA 2018.2.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_144\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\deploy.jar;C:\Program m Files\Java\jdk1.8.0_144\jre\lib\rt.jar;D:\IDEA2018\springmvc\target\classes;D:\apache-1.7.0-M1.jar;D:\apache-maven-3.5.4-bin\rep\dom4j\dom4j\1.6.1\dom4j-1.6.1.jar;D:\apache-maven-3.5.4-bin\rep\xml-apis\xml-apis\1.0.b2\xml-apis-1.0.b2.jar" 
dao
services

Process finished with exit code 0

测试Constructor

<?xml version="1.0" encoding="UTF-8"?>
<beans>
    <bean id="dao" class="com.luo.dao.DaoImpl"></bean>

    <bean id="service" class="com.luo.service.ServiceImpl">
        <constructor-arg name="dao" ref="dao"/>
    </bean>
</beans>

结果

"C:\Program Files\Java\jdk1.8.0_144\bin\java.exe" "-javaagent:D:\IntelliJ IDEA\IntelliJ IDEA 2018.2.4\lib\idea_rt.jar=55916:D:\IntelliJ IDEA\IntelliJ IDEA 2018.2.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_144\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\deploy.jar;C:\Program m Files\Java\jdk1.8.0_144\jre\lib\rt.jar;D:\IDEA2018\springmvc\target\classes;D:\apache-1.7.0-M1.jar;D:\apache-maven-3.5.4-bin\rep\dom4j\dom4j\1.6.1\dom4j-1.6.1.jar;D:\apache-maven-3.5.4-bin\rep\xml-apis\xml-apis\1.0.b2\xml-apis-1.0.b2.jar" 
dao
services

Process finished with exit code 0

测试Autowire

<?xml version="1.0" encoding="UTF-8"?>

<beans default-autowire="byType">

    <bean id="dao" class="com.luo.dao.DaoImpl"></bean>
    <bean id="dao2" class="com.luo.dao.DaoImpl2"></bean>

    <bean id="service" class="com.luo.service.ServiceImpl"></bean>

    <bean id="service2" class="com.luo.service.ServiceImpl2"></bean>
    
</beans>

自定义异常

public class MacherException extends Exception {
    public  MacherException(String msg){
        super(msg);
    }
}

测试

public class Test01 {
    public static void main(String[] args) throws Exception {
        BeanFactory beanFactory = new BeanFactory("spring.xml");
       Service service = (Service) beanFactory.getBean("service");
        service.service();
    }
}

结果

"C:\Program Files\Java\jdk1.8.0_144\bin\java.exe" "-javaagent:D:\IntelliJ IDEA\IntelliJ IDEA 2018.2.4\lib\idea_rt.jar=60383:D:\IntelliJ IDEA\IntelliJ IDEA 2018.2.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\nashorn.jar;C:\Program 1.7.0-M1.jar;D:\apache-maven-3.5.4-bin\rep\dom4j\dom4j\1.6.1\dom4j-1.6.1.jar;D:\apache-maven-3.5.4-bin\rep\xml-apis\xml-apis\1.0.b2\xml-apis-1.0.b2.jar" 
dao2222
com.luo.MyException.MacherException: 需要一个bean,但是找到了两个
services
	at com.luo.utils.BeanFactory.pasingXML(BeanFactory.java:105)
	at com.luo.utils.BeanFactory.<init>(BeanFactory.java:30)
	at com.luo.test.Test01.main(Test01.java:13)

Process finished with exit code 0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

罗罗的1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值