模拟 Spring IOC 容器 Bean 对象实例化

模拟 Spring IOC 容器 Bean 对象实例化,第1张

模拟 Spring IOC 容器 Bean 对象实例化 Spring IOC 容器 Bean对象实例化模拟

思路:
1.定义Bean 工厂接口,提供获取bean方法
2.定义Bean工厂接口实现类,解析配置文件,实例化Bean对象
3.实现获取Bean方法

新建Maven项目

1.创建Maven的普通java项目

2.设置项目的坐标、名称、工作空间

3.设置项目的 Maven 环境

定义 Bean 属性对象
package com.xxxx.po;


public class MyBean {

    private String id;//bean标签的id属性
    private String clazz;//bean标签的class属性

    public MyBean() {
    }

    public MyBean(String id, String clazz) {
        this.id = id;
        this.clazz = clazz;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getClazz() {
        return clazz;
    }

    public void setClazz(String clazz) {
        this.clazz = clazz;
    }

}

添加 dom4j 和 XPath 坐标依赖
        
        
            dom4j
            dom4j
            1.6.1
        

        
        
            jaxen
            jaxen
            1.1.6
        
准备自定义配置文件

spring.xml




    
    
    

定义 Bean 工厂接口
package com.xxxx.factory;


public interface MyFactory {
    //通过id属性获取bean对象
    public Object getBean(String id);
}

定义 Bean 接口的实现类
package com.xxxx.factory;

import com.xxxx.po.MyBean;
import org.dom4j.document;
import org.dom4j.documentException;
import org.dom4j.Element;
import org.dom4j.XPath;
import org.dom4j.io.SAXReader;

import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


public class MyClassPathXmlApplication implements MyFactory{

    private List beanList = null;//存放解析好的bean标签集合
    private Map beanMap = new HashMap<>();//实例化好的bean对象放入map

    //获取要解析的配置文件
    //通过带参构造器得到相关配置文件
    public MyClassPathXmlApplication(String fileName){

        //解析配置文件,将结果设置到list中
        this.parseXml(fileName);

        //实例化Bean对象,将结果设置到map中
        this.instanceBean();

    }



    
    private void parseXml(String fileName) {
        //获取解析器
        SAXReader saxReader = new SAXReader();
        //得到要解析的配置文件的url
        URL url = this.getClass().getClassLoader().getResource(fileName);

        try {
            //通过解析器解析xml文件(spring.xml),返回document对象
            document document = saxReader.read(url);
            //通过xpath语法,获取beans标签下的所有bean标签
            XPath xPath = document.createXPath("beans/bean");
            //通过XPath语法获取要解析的指定元素
            List elementList = xPath.selectNodes(document);
            //判断标签集合是否存在
            if(elementList != null && elementList.size()>0){
                //实例化集合
                beanList= new ArrayList<>();
                //遍历集合
                for(Element el : elementList){
                    //获取元素的id属性值和class属性值
                    String id = el.attributevalue("id");
                    String clazz = el.attributevalue("class");
                    //将id和clazz的值设置到对应的bean对象中
                    MyBean myBean = new MyBean(id,clazz);
                    //将对应的bean对象设置到集合中
                    beanList.add(myBean);
                }
            }
        } catch (documentException e) {
            e.printStackTrace();
        }

    }

    
    private void instanceBean() {
        //判断bean对象的集合是否存在
        if(beanList != null && beanList.size()>0){
            //遍历
            for(MyBean bean : beanList){
                try {
                    //键
                    String id = bean.getId();
                    //值(实例化好的对象)
                    //通过class的值(类路径)得到实例化对象
                    Object object = Class.forName(bean.getClazz()).newInstance();
                    //设置map
                    beanMap.put(id,object);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    
    @Override
    public Object getBean(String id) {
        return beanMap.get(id);
    }
}

创建与配置文件中对应的 Bean 对象

UserService.java

package com.xxxx.service;

public class UserService {
    public void test(){
        System.out.println("UserService...");
    }
}

UserDao.java

package com.xxxx.dao;

public class UserDao {
    public void test(){
        System.out.println("UserDao...");
    }
}

测试是否可以获取实例化的Bean对象
package com.xxxx;

import com.xxxx.dao.UserDao;
import com.xxxx.factory.MyClassPathXmlApplication;
import com.xxxx.factory.MyFactory;
import com.xxxx.service.UserService;


public class App {
    public static void main(String[] args) {
        //得到上下文环境
        MyFactory factory = new MyClassPathXmlApplication("spring.xml");

        //得到实例化好的对象
        UserService userService = (UserService) factory.getBean("userService");
        UserDao userDao = (UserDao) factory.getBean("userDao");

        UserDao userDao2 = (UserDao) factory.getBean("userDao");
        System.out.println(userDao);
        System.out.println(userDao2);

        userService.test();
        userDao.test();
    }
}

测试结果
com.xxxx.dao.UserDao@4e515669
com.xxxx.dao.UserDao@4e515669
UserService...
UserDao...

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4968184.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-13
下一篇 2022-11-13

发表评论

登录后才能评论

评论列表(0条)

保存