目录
手动开发- 简单的 Spring 基于 XML 配置的程序
需求说明
思路分析
WyxApplicationContextTest
xml配置
注意
手动开发- 简单的 Spring 基于 XML 配置的程序
需求说明
1. 自己写一个简单的 Spring 容器, 通过读取 beans.xml,获取第 1 个 JavaBean: Monster 的 对象,并给该的对象属性赋值,放入到容器中, 输出该对象信息.
2. 也就是说,不使用 Spring 原生框架,我们自己简单模拟实现
3. 可以了解 Spring 容器的简单机制
思路分析
WYXApplicationContext
1. 这个程序用于实现Spring的一个简单容器机制
2. 后面我们还会详细的实现
3. 这里我们实现如何将beans.xml文件进行解析,并生成对象,放入容器中
4. 提供一个方法 getBean(id) 返回对应的对象
5. 这里就是一个开胃小点心, 理解Spring容器的机制
步骤
1. 得到类加载路径
2. 创建 Saxreader
3. 得到Document对象
4. 得到rootDocument
5. 得到第一个bean-monster01
6. 获取到第一个bean-monster01的相关属性
7. 使用反射创建对象.=> 回顾反射机制
8. 将创建好的对象放入到singletonObjects
/**
* 解读
* 1. 这个程序用于实现Spring的一个简单容器机制
* 2. 后面我们还会详细的实现
* 3. 这里我们实现如何将beans.xml文件进行解析,并生成对象,放入容器中
* 4. 提供一个方法 getBean(id) 返回对应的对象
* 5. 这里就是一个开胃小点心, 理解Spring容器的机制
*/
public class WYXApplicationContext {
private ConcurrentHashMap<String, Object> singletonObjects =
new ConcurrentHashMap<>();
//构造器
//接收一个容器的配置文件 比如 beans.xml, 该文件默认在src
public HspApplicationContext(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);
}
}
WyxApplicationContextTest
主函数这个类的作用为调用WyxApplicationContext类并且传入xml文件名
public class WyxApplicationContextTest {
public static void main(String[] args) throws Exception {
HspApplicationContext ioc =
new WyxApplicationContext("beans.xml");
Monster monster01 = (Monster)ioc.getBean("monster01");
System.out.println("monter01=" + monster01);
System.out.println("monster01.name=" + monster01.getName());
System.out.println("ok");
}
}
xml配置
<bean class="com.spring.bean.Monster" id="monster01">
<property name="monsterId" value="100"/>
<property name="name" value="牛魔王"/>
<property name="skill" value="芭蕉扇"/>
</bean>
注意
如果没有指定id 不会报错,会正常运行
系统会默认分配 id ,分配 id 的规则是 全类名#0 , 全类名#1