SpringIOC就不在介绍了的吧,对容器创建,管理对象的过程非常有必要自己熟悉了解一下其中的生产规程。手写一个简易版的吧。
不多说,先写一个出来
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.lang.reflect.Field;
import java.util.List;
/**
* @Author: panda
* @Data: 2018/12/10 0:15
* @Version: 1.0
*/
public class ClassPathXmlApplicationContext {
private String xmlPath;
public ClassPathXmlApplicationContext(String xmlPath){
this.xmlPath = xmlPath;
}
Object object = null;
public Object getBean(String beanId)throws Exception{
//xml解析器
SAXReader saxReader = new SAXReader();
//得到document文档对象
Document read = saxReader.read(this.getClass().getClassLoader().getResourceAsStream(xmlPath));
//得到根节点对象
Element rootElement = read.getRootElement();
//得到对象元素
List<Element> elements = rootElement.elements();
for(Element element : elements){
String elementId = element.attributeValue("id");
if(!beanId.equals(elementId)){
continue;
}
String className = element.attributeValue("class");
Class<?> forName = Class.forName(className);
object = forName.getInterfaces();
List<Element> elementsList = element.elements();
for(Element element1 : elementsList){
String name = element1.attributeValue("name");
String value = element1.attributeValue("value");
Field declaredField = forName.getDeclaredField(name);
declaredField.setAccessible(true);
declaredField.set(object,value);
}
}
return object;
}
public static void main(String[] args)throws Exception {
ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("test.xml");
User user = (User) classPathXmlApplicationContext.getBean("user");
System.out.println(user);
}
}
<?xml version="1.0" encoding="utf-8" ?> <beans> <bean id="user" class="com.example.demo.User"> <property name="id" value="1"></property> <property name="name" value="panda"></property> </bean> </beans>
/**
* @Author: panda
* @Data: 2018/12/10 0:45
* @Version: 1.0
*/
public class User {
private String id;
private String name;
public User(){
}
public User(String id){
this.id = id;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
总结:
每个人写代码的风格都不一样,主要是学习其思想