概述
前言:距离上次更新已经一个月,最近一个月学习了一下Vue3、微服务、开始做一个OA系统、准备面试…。效率不太高。
1. 需求说明
自己写一个简单的Spring
容器,通过读取beans.xml
,获取第1个JavaBean: Monste
r的对象,并给该的对象属性赋值,输出该对象信息.
不使用Spring原生框架,我们自己简单模拟实现,让大家了解Spring容器的简单机制
2. 思路分析
- 使用xml的解析技术-
Dom4j
- 读取beans.xml
- 解析得到monster对象的id,classpath,属性
- 使用反射,创建对象
- 放入到ioc容器(hashmap)
- 提供一个getBean方法
DOM4j技术文章:XML 解析技术:DOM4j
3. 完成步骤
注:想使用SAXReader类必须导入DOM4j的包或者依赖
1. 创 建 HJApplicationContext.java
import com.hj.spring.bean.Monster;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.lang.reflect.Method;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
/**
* 1. 这个程序用于实现Spring的一个简单容器机制
* 2. 后面我还会详细的实现
* 3. 这里我们实现如何将beans.xml文件进行解析,并生成对象,放入容器中
* 4. 提供一个方法 getBean(id) 返回对应的对象
* 5. 这里就是一个开胃小点心, 理解Spring容器的机制
*/
public class HJApplicationContext {
private ConcurrentHashMap<String, Object> singletonObjects =
new ConcurrentHashMap<>();
//构造器
//接收一个容器的配置文件 比如 beans.xml, 该文件默认在src
public HJApplicationContext(String iocBeanXmlFile) throws Exception {
//1. 得到类加载路径
String path = this.getClass().getResource("/").getPath();
//2. 创建 Saxreader
SAXReader saxReader = new SAXReader();
//3. 得到Document对象
Document document =
saxReader.read(new File(path + iocBeanXmlFile));
//4. 得到rootDocument
Element rootElement = document.getRootElement();
//5. 得到第一个bean-monster01
Element bean = (Element) rootElement.elements("bean").get(0);
//6. 获取到第一个bean-monster01的相关属性
String id = bean.attributeValue("id");
String classFullPath = bean.attributeValue("class");
List<Element> property = bean.elements("property");
//遍历->简化直接获取
Integer monsterId =
Integer.parseInt(property.get(0).attributeValue("value"));
String name = property.get(1).attributeValue("value");
String skill = property.get(2).attributeValue("value");
//7. 使用反射创建对象.=> 回顾反射机制
Class<?> aClass = Class.forName(classFullPath);
//这里o对象就是Monster对象
Monster o = (Monster) aClass.newInstance();
//给o对象赋值
//反射来赋值=> 这里简化,直接赋值->目的就是先理解流程
//这里的方法就是setter方法
//Method[] declaredMethods = aClass.getDeclaredMethods();
//for (Method declaredMethod : declaredMethods) {
// declaredMethod.invoke();
//}
//赋值
o.setMonsterId(monsterId);
o.setName(name);
o.setSkill(skill);
//8. 将创建好的对象放入到singletonObjects
singletonObjects.put(id, o);
}
public Object getBean(String id) {
return singletonObjects.get(id);
}
}
2. 配置文件如图
3. 创建测试类HJApplicationContextTest
import com.hj.spring.bean.Monster;
/**
* @author hj
*/
public class HJApplicationContextTest {
public static void main(String[] args) throws Exception {
HJApplicationContext ioc =
new HJApplicationContext("beans.xml");
Monster monster01 = (Monster)ioc.getBean("monster01");
System.out.println("monter01=" + monster01);
System.out.println("monster01.name=" + monster01.getName());
}
}
最后
以上就是眯眯眼鞋子为你收集整理的【Spring】带你简单了解 Spring 解析 XML 配置的机制的全部内容,希望文章能够帮你解决【Spring】带你简单了解 Spring 解析 XML 配置的机制所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复