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

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

1.创建一个普通的maven项目

在pom.xmll文件中导入dom4j解析器和xpath路径分析器

<dependency>
    <groupId>dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>1.6.1</version>
</dependency>
        <dependency>
            <groupId>jaxen</groupId>
            <artifactId>jaxen</artifactId>
            <version>1.1.6</version>
        </dependency>

2.创建一个实例化类

作用:来接收文件的id 和 class 文件对象

//定义一个对象,来接收bean文件中的id 和 class 信息
public class MyBean {

    private String id;
    private String Clazz;

    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) {
        Clazz = clazz;
    }
}

3.在reasource文件包下创建spring.xml文件

<?xml version="1.0" encoding="utf-8" ?>
<beans>
    <bean id = "userDao" class = "com.Dao.UserDao"></bean>
</beans>

4.创建一个工厂类接口

  1. 规范接口
  2. 接收文件
public interface MyFactory {
//    规范
//    通过id 属性值 获取bean对象
    public Object getBean(String id);
}

5.创建一个工厂类

1.获取文件并解析

2.用dom4j解析配置文件,并得到list集合

3.反射得到实例化对象,遍历集合,得到classs属性,利用Class.forName(class).newInstance()

4.获取指定对象

代码实现

private List<MyBean> beanList;
private Map<String,Object> beanMap = new HashMap<>();
    public MyClassPathApplicationXml(String fileName) {
//        1.通过dom4j解析文件,得到list(存放id 和 class )
        this.parseXml(fileName);
        // 2.遍历List,将实例化的对象存放到beanMap中
        this.instanceBeans(fileName);
    }
private void parseXml(String fileName)  {
    //1.获取解析器
        SAXReader saxReader = new SAXReader();
    //2.得到配置文件的路径
        URL url = this.getClass().getClassLoader().getResource(fileName);
        try {
    //3.通过解析器解url  
            Document document = saxReader.read(url);
    //4.获取xpath 语法,获取beans 下的  bean
            XPath xPath = document.createXPath("beans/bean");
     //5.通过指定语法解析对象,将其存入list中
            List<Element> elements = xPath.selectNodes(document);
            if(elements != null && elements.size() > 0){
                beanList = new ArrayList<>();
                for(Element el : elements){
                    String id = el.attributeValue("id");   //id 属性
                    String clazz = el.attributeValue("class");   //class 属性
                    MyBean myBean = new MyBean(id,clazz);
                    beanList.add(myBean);
                }
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
    private void instanceBeans(String fileName) {
        if(beanList != null && beanList.size() > 0){
            for(MyBean myBean: beanList){
                String id = myBean.getId();
                String clazz = myBean.getClazz();
//
                try {
                    //实例化对象
                    Object object = Class.forName(clazz).newInstance();
                    //将实例化对象存入到hashmap中
                    beanMap.put(id,object);
                } catch (InstantiationException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            }
        }
    }

调用

public static void main(String[] args) {
        MyFactory myFactory = new MyClassPathApplicationXml("spring.xml");
        UserDao userDao = (UserDao) myFactory.getBean("userDao");
        userDao.test();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

KeyichenCRAZY

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

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

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

打赏作者

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

抵扣说明:

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

余额充值