前言:距离上次更新已经一个月,最近一个月学习了一下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
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81import 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
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18import 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】带你简单了解内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复