IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring IOC容器Bean对象实例化模拟 -> 正文阅读

[Java知识库]Spring IOC容器Bean对象实例化模拟

思路:

????????1、定义Bean工厂接口,提供获取bean方法

????????2、定义Bean工厂接口实现类,解析配置文件,实现Bean对象

????????3、实现获取Bean方法

定义Bean属性对象

? ? ? ? Spring.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans>
    <bean id="userDao" class="org.example.dao.UserDao"></bean>
    <bean id="userDao" class="org.example.service.UserService"></bean>
</beans>

? ? ? ?工厂类实现类:

? ? ? ? ? ? ? ? 1、通过构造器的形参传递要解析的配置文件;

? ? ? ? ? ? ? ? 2、解析配置文件,得到对应的bean标签的id与class属性值,并设置对应的bean对象中,存放到 list 集合里;

? ? ? ? ? ? ? ? 3、遍历list集合,得到每个Bean对象,得到class属性对应的实例化对象,并设置到map中,通过id与实例化bean对象;

? ? ? ? ? ? ? ? 4、通过getBean方法,从map对象中通过id获取指定value,value即是实例化对象。

????????

? ? ? ? ?XPath是一门在XML文档中查找信息的语言,其是XSLT中的注意元素。XQuery和XPointer均构建与XPath表达式之上。XPath使用路径表达式来选取XML文档中的节点活节点集。节点是通过沿着路径(path)或者步(steps)来选取的。(了解即可)

????????

?????????MyClassPathXmlApplication.java:

package org.example.factory;

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;

/**
 * 工厂接口的实现类
 * 1、通过构造器的形参传递要解析的配置文件
 * 2、解析配置文件,得到对应的bean标签的id与class属性值,并设置到对应的bean对象中,存放到list集合里
 * 3、遍历list集合,得到每个Bean对象,得到class属性对应的实例化对象,并设置到map中,通过id与实例化bean对象
 * 4、通过getBean方法,从map对象中通过id获取指定value,value即是实例化的对象
 */
public class MyClassPathXmlApplication implements MyFacotry {
    // 定义一个Map对象,用来存放id属性与对应class属性实例化好的Bean对象
    private Map<String,Object> beanMap = new HashMap<>();
    // 定义List集合,用来存放配置文件中Bean中对应的id与class的mybean(用来存放id与class属性值)中
    private List<MyBean> beanlist = null;
    // 1、通过构造器的形参传递要解析的配置文件
    public MyClassPathXmlApplication(String fileName) {
        // 解析配置文件
        parseXml(fileName);
        // 得到实例化对象
        instanceBean();
    }

    // 2、解析配置文件,得到对应的bean标签的id与class属性值,并设置到对应的bean对象中,存放到ist集合里
    private void parseXml(String fileName) {
        try {
            //得到解析器
            SAXReader reader = new SAXReader();
            //得到配置文件对应的URL
            URL url = this.getClass().getClassLoader().getResource(fileName);
            //解析配置文件得到Document对象
            Document document = reader.read(url);
            /**
             * xPath使用路径表达式来选取XML文档中的节点或节点集
             * 定义xPath语法,获取beans标签下的所有子元素bean标签
             */
            XPath xPath = document.createXPath("beans/bean");
            // 通过xPath语法,得到对应的bean标签,返回Element集合
            List<Element> elementList = xPath.selectNodes(document);
            // 判断Element集合是否为之空
            if (elementList != null && elementList.size() > 0){
                // 实例化beanList集合
                beanlist = new ArrayList<>();
                // 遍历Element集合,得到Element对象,得到对应的属性值
                for (Element element : elementList){
                    //得到对应的id属性值 attributeValue:通过指定属性名得到对应的属性值
                    String id = element.attributeValue("id");
                    //得到对应的class属性值
                    String classes = element.attributeValue("class");
                    // 将id属性值与class属性值设置MyBean对象
                    MyBean myBean = new MyBean(id,classes);
                    // 将对应的MyBean对象设置到beanList集合中
                    beanlist.add(myBean);
                }
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }

    // 3、遍历list集合,得到每个Bean对象,得到class属性对应的实例化对象,并设置到map中,通过id与实例化bean对象
    private void instanceBean() {
        // 判读beanList是否为空
       try {
           if (beanlist != null && beanlist.size() > 0){
               // 遍历beanList集合,得到对应的MyBean对象
               for (MyBean myBean : beanlist){
                   // 得到id值
                   String id = myBean.getId();
                   // 得到class值
                   String classes = myBean.getClasses();
                   // 通过反射,实例化指定class属性值对应的Bean对象
                   Object object = Class.forName(classes).newInstance();
                   // 将id值与实例化好的bean对象,设置到map中
                   beanMap.put(id,object);
               }
           }
       } catch (IllegalAccessException e) {
           e.printStackTrace();
       } catch (InstantiationException e) {
           e.printStackTrace();
       } catch (ClassNotFoundException e) {
           e.printStackTrace();
       }
    }

    // 4、通过getBean方法,从map对象中通过id获取指定value,value既是实例化的对象
    @Override
    public Object getBean(String id) {
        // 通过id属性,从map获取对应的实例化对象
        Object object = beanMap.get(id);
        return object;
    }
}

? ? ? ? MyFactory.java:

package org.example.factory;

/**
 * 工厂模式
 * 自定义工厂类
 */
public interface MyFacotry {
    //通过id属性值获取实例化对象
    public Object getBean(String id);

}

? ? ? ? UserService.java:

package org.example.service;

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

? ? ? ? UserDao.java:

package org.example.dao;

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

? ? ? ? start.java:

package org.example;

import org.example.factory.MyClassPathXmlApplication;
import org.example.factory.MyFacotry;
import org.example.service.UserService;

public class start {
    public static void main(String[] args) {
        // 得到工厂类
        MyFacotry facotry = new MyClassPathXmlApplication("spring.xml");
        // 通过getBean方法,得到指定的Bean对象
        UserService userService = (UserService) facotry.getBean("userDao");
        userService.test();
    }
}

? ? ? ? 结果是”UserService...“。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-09 10:06:43  更:2021-08-09 10:07:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/11 1:09:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码