简单模拟spring IOC底层实现原理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiangshuai198807/article/details/87566596

工厂 + 反射+配置文件实现代码如下:

 

/**

 * @author xiangshuai

 * 所在位置:E:\学习文档子目录压缩\框架\spring\简单模拟spring IOC底层实现原理

 

我的网盘/我的笔记/学习文档子目录压缩/框架/spring/简单模拟spring IOC底层实现原理 *

 */

 

BeanFactory.java

package com.xiangshuai.util;

 

import java.util.Map;

 

import cn.xiangshuai.bean.User;

 

 

/**

 * @author xiangshuai

 * 所在位置:E:\学习文档子目录压缩\框架\spring\简单模拟spring IOC底层实现原理.doc

 

我的网盘/我的笔记/学习文档子目录压缩/框架/spring/简单模拟spring IOC底层实现原理.doc

 *

 */

public  class BeanFactory {

    private  static BeanFactory mySingleton=null;

 

    /*私有构造方法,防止被实例化*/

    private BeanFactory() {

    }

 

    public static  BeanFactory getInstance(){

        if(mySingleton==null){//只有第一次创建才会进入  synchronized加锁,提高性能

            synchronized (BeanFactory.class){

                if(mySingleton==null){//加锁,防多线程,造出多个实例

                    try {

                        //Thread.sleep(3000);

                        mySingleton=new BeanFactory();

                    }catch (Exception e){

                        e.printStackTrace();

                    }

 

                }

            };

        }

        return mySingleton;

    }

    public static Object getBean(String id){

          Map<String, String> beanMap = Dom4jUtil.getInstance().getBeanMap();

          String qlm = beanMap.get(id);

          Class<?> clazz=null;

          Object bean=null;

       try {

           clazz = Class.forName(qlm);

           bean = clazz.newInstance();

       } catch (ClassNotFoundException e) {

           e.printStackTrace();

       } catch (InstantiationException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       } catch (IllegalAccessException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

         return bean;

      }

      

     public static void main(String[] args) {

       User user = (User) BeanFactory.getInstance().getBean("user");

       System.out.println(user);

        //Object bean = BeanFactory.getInstance().getBean("user");

    }

    

}

 

Dom4jUtil.java

package com.xiangshuai.util;

 

import java.util.HashMap;

import java.util.List;

import java.util.Map;

 

 

import org.dom4j.Attribute;

import org.dom4j.Document;

import org.dom4j.DocumentException;

import org.dom4j.Element;

import org.dom4j.Node;

import org.dom4j.io.SAXReader;

 

public class Dom4jUtil {

        private  static Dom4jUtil mySingleton=null;

 

        /*私有构造方法,防止被实例化*/

        private Dom4jUtil() {

        }

 

        public static  Dom4jUtil getInstance(){

            if(mySingleton==null){//只有第一次创建才会进入  synchronized加锁,提高性能

                synchronized (Dom4jUtil.class){

                    if(mySingleton==null){//加锁,防多线程,造出多个实例

                        try {

                            //Thread.sleep(3000);

                            mySingleton=new Dom4jUtil();

                        }catch (Exception e){

                            e.printStackTrace();

                        }

 

                    }

                };

            }

            return mySingleton;

        }

   

    public static Map<String, String>  getBeanMap(){

       Map<String, String> beanMap=new HashMap<String, String>();

       try {

           String xmlUrl="src/applicationContext.xml";

           SAXReader read = new SAXReader();

           Document document = read.read(xmlUrl);

           Element root = document.getRootElement();

           List<Element> elements = root.elements("bean");//获得所有 bean 节点元素

           for (Element bean : elements) {

              //假设 bean都市这种最简单的<bean  id="user" class="cn.xiangshuai.bean.User" ></bean>

              Attribute name = bean.attribute("id");//属性节点

              Attribute clazz = bean.attribute("class");//属性节点

              String beanId = name.getValue();

              String qlm = clazz.getValue();//获取全类名

              beanMap.put(beanId, qlm);  // id class 的值放入map key ,value

           }

       } catch (DocumentException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

       return beanMap;

    }

    //如果是较复杂的bean,可以用Map<Integer,Map<Map<Map<>>>> 前面装此 <bean> 有几层等

    public void treeWalk(Element ele) {

       System.out.println(ele.getName());//输出当前节点的名子

       for (int i = 0; i < ele.nodeCount(); i++) {//ele.nodeCount()得到当前节点的所有子节点的数量

           Node node = ele.node(i);//取出下标为i的节点

           if(node instanceof Element){//判断当前节点是否为标签

              treeWalk((Element)node);//node强转为标签(Element)

           }else{

              System.out.println(node.getText());

           }

       }

    }

   

   

   

    public static void main(String[] args) {

        Map<String, String> beanMap = Dom4jUtil.getInstance().getBeanMap();

        System.out.println(beanMap);

    }

   

}

 

applicationContext.xml

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

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">

 

    <bean  id="user" class="cn.xiangshuai.bean.User" ></bean>

    <bean  id="org" class="cn.xiangshuai.bean.Org" ></bean>

   

</beans>

 

 

 

猜你喜欢

转载自blog.csdn.net/xiangshuai198807/article/details/87566596
今日推荐