spring框架的原理其实主要是dom4j+反射+xml.原理就是将xml用dmo4j解析,然后取出xml中的元素赋值到实体类中,实体类用反射机制获取其中的属性。下面具体来说明一下。
首先创建一个UserEntity的实体类.
第一步:创建一个实体类
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="user1" class="entity.UserEntity">
<property name="userId" value="0001"></property>
<property name="userName" value="余胜军"></property>
</bean>
<bean id="user2" class="entity.UserEntity">
<property name="userId" value="0002"></property>
<property name="userName" value="张三"></property>
</bean>
</beans>
第二步:手写一个简单的xml
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student1 id="001">
<简书>@听风_与你</简书>
<学号>20140101</学号>
<地址>上海市浦东新区世纪大道</地址>
<座右铭>要么强大,要么听话</座右铭>
</student1>
<student2 id="002">
<简书>@听风_与你</简书>
<学号>20140102</学号>
<地址>上海市浦东新区世纪大道</地址>
<座右铭>自信不自大,失败不气馁,倒了爬起来</座右铭>
</student2>
</students>
第三步:创建一个解析xml并且反射将值赋值的类。
package classForm;
import java.lang.reflect.Field;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import entity.UserEntity;
public class ClassPathXmlApplicationContext {
private String xmlPath;
public ClassPathXmlApplicationContext(String xmlPath) {
this.xmlPath = xmlPath;
}
public Object getBean(String beanId) throws Exception {
// 解析xml器
SAXReader saxReader = new SAXReader();
Document read = null;
try {
// 从项目根目录路径下 读取
read = saxReader.read(this.getClass().getClassLoader()
.getResourceAsStream(xmlPath));
} catch (Exception e) {
e.printStackTrace();
}
if (read == null) {
return null;
}
// 获取根节点资源
Element root = read.getRootElement();
List<Element> elements = root.elements();
if (elements.size() <= 0) {
return null;
}
Object oj = null;
for (Element element : elements) {
String id = element.attributeValue("id");
if (StringUtils.isEmpty(id)) {
return null;
}
if (!id.equals(beanId)) {
continue;
// throw new Exception("使用beanId:" + beanId + ",未找到该bean");
}
// 获取实体bean class地址
String beanClass = element.attributeValue("class");
// 使用反射实例化bean
Class<?> forNameClass = Class.forName(beanClass);
oj = forNameClass.newInstance();
// 获取子类对象
List<Element> attributes = element.elements();
if (attributes.size() <= 0) {
return null;
}
for (Element et : attributes) {
// 使用反射技术为方法赋值
String name = et.attributeValue("name");
String value = et.attributeValue("value");
Field field = forNameClass.getDeclaredField(name);
field.setAccessible(true);
field.set(oj, value);
}
}
return oj;
// 1.使用beanId查找配置文件中的bean。
// 2.获取对应bean中的classpath配置
// 3.使用java反射机制实体化对象Class
}
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(
"applicationContext.xml");
UserEntity bean = (UserEntity) applicationContext.getBean("user2");
System.out.println("使用反射获取bean" + bean.getUserId() + "---" + bean.getUserName());
}
}
当然这是最简单的手写spring.这是原理.希望各位有什么好建议提出来,虚心求教。