手动开发简单的Spring基于XML配置的程序
需求说明:
- 自己写一个简单的 Spring 容器, 通过读取 beans.xml,获取第 1 个 JavaBean: Monster 的
对象,并给该的对象属性赋值,放入到容器中, 输出该对象信息. - 也就是说,不使用 Spring 原生框架,我们自己简单模拟实现
- 可以让大家了解 Spring 容器的简单机制
思路分析:
beans01.xml(配置文件)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="com.hykedu.spring.bean.Monster" id="monster01">
<property name="monsterId" value="100"/>
<property name="name" value="牛魔王"/>
<property name="skill" value="芭蕉扇"/>
</bean>
</beans>
Monster.java(测试对象类)
package com.hykedu.spring.bean;
public class Monster {
private Integer monsterId;
private String name;
private String skill;
public Monster() {
}
public Monster(Integer monsterId, String name, String skill) {
this.monsterId = monsterId;
this.name = name;
this.skill = skill;
}
public Integer getMonsterId() {
return monsterId;
}
public void setMonsterId(Integer monsterId) {
this.monsterId = monsterId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSkill() {
return skill;
}
public void setSkill(String skill) {
this.skill = skill;
}
@Override
public String toString() {
return "Monster{" +
"monsterId=" + monsterId +
", name='" + name + '\'' +
", skill='" + skill + '\'' +
'}';
}
}
简单的Spring基于XML配置的程序(代码如下)
package com.hykedu.spring.codeSnakeapplicationcontext;
import org.dom4j.Document;
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;
public class CodeSnakeApplicationContext {
public static void main(String[] args) throws Exception {
CodeSnakeApplicationContext ApplicationContext = new CodeSnakeApplicationContext("beans.xml");
Object monster01 = ApplicationContext.getBean("monster01");
System.out.println(monster01);
}
private ConcurrentHashMap<String, Object> singletonObjects = new ConcurrentHashMap<>();
public CodeSnakeApplicationContext(String iocBeanXmlFile) throws Exception {
String path = "src/beans01.xml";
SAXReader reader = new SAXReader();
Document document = reader.read(new File(path));
Element rootElement = document.getRootElement();
Element bean = (Element)rootElement.elements("bean").get(0);
String id = bean.attributeValue("id");
String classFullPath = bean.attributeValue("class");
List<Element> property = bean.elements("property");
int monsterId = Integer.parseInt(property.get(0).attributeValue("value"));
String name = property.get(1).attributeValue("value");
String skill = property.get(2).attributeValue("value");
Class<?> aClass = Class.forName(classFullPath);
Object o = aClass.newInstance();
Method setMonsterId = aClass.getMethod("setMonsterId",Integer.class);
Method setName = aClass.getMethod("setName",String.class);
Method setSkill = aClass.getMethod("setSkill",String.class);
setMonsterId.invoke(o,monsterId);
setName.invoke(o,name);
setSkill.invoke(o,skill);
singletonObjects.put(id,o);
}
public Object getBean(String id){
return singletonObjects.get(id);
}
}
运行结果:
也是成功读取到bean工厂里面创建好的对象,今天的分享就到这里啦,如果觉得我分享的内容还不错,可以关注一下我的公众号程序员蛇皮,谢谢支持,我们下期再见!