需要使用到.xml解析工具、java的反射技术。
文件的路径,其中spring-config.xml的路径放置位置需要注意!
spring-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<bean id="date" class="java.util.Date" lazy="true"/>
<bean id="obj" class="java.lang.Object" />
</beans>
HelloService
模拟一个service层的实例对象
public class HelloService {
public void hello(){
System.out.println("hello Spring IoC... !!!");
}
}
BeanDefinition
为解析的数据提供的一个存储对象,可以理解为一个VO(Value-Object)对象
public class BeanDefinition {
private String id; //bean id
private String pckClass; //字符串类型的全路径
private Boolean lazy = false; //懒加载
@Override
public String toString() {
return "BeanDefinition{" +
"id='" + id + '\'' +
", pckClass='" + pckClass + '\'' +
", lazy=" + lazy +
'}';
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPckClass() {
return pckClass;
}
public void setPckClass(String pckClass) {
this.pckClass = pckClass;
}
public Boolean getLazy() {
return lazy;
}
public void setLazy(Boolean lazy) {
this.lazy = lazy;
}
}
ClassPathXmlApplicationContext
注意:在编码过程中只针对执行逻辑进行编码,忽略对异常的处理。即这只是伪代码!!!
复制粘贴需要对异常进行处理。
并且,xml文件的解析使用的是dom解析,也可以使用其他xml解析技术。
public class ClassPathXmlApplicationContext {
// 配置对象存储map集
private HashMap<String, BeanDefinition> beanMap = new HashMap<>();
// 实例对象存储map集
private HashMap<String, Object> instanceMap = new HashMap<>();
public ClassPathXmlApplicationContext(String pathXml){
InputStream in = getClass().getClassLoader().getResourceAsStream(pathXml);
parse(in);
}
private void parse(InputStream in) {
Document doc = null;
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
doc = builder.parse(in);
Element e = doc.getDocumentElement();
NodeList ns = e.getElementsByTagName("bean");
// 解析Dom树,使用VO对象对数据进行封装。
processDocument(ns);
}
private void processDocument(NodeList ns) {
for (int i = 0; i < ns.getLength(); i++) {
Element item = (Element) ns.item(i);
String id = item.getAttribute("id");
String pckClass = item.getAttribute("class");
Boolean lazy = Boolean.valueOf(item.getAttribute("lazy"));
BeanDefinition bd = new BeanDefinition();
bd.setId(id);
bd.setPckClass(pckClass);
bd.setLazy(lazy);
beanMap.put(id, bd);
//是否懒加载
if (!lazy)
instanceMap.put(id,newInstanceBean(Class.forName(pckClass)));
}
}
//创建bean
private Object newInstanceBean(Class<?> cls) {
Object o = null;
Constructor<?> con = cls.getDeclaredConstructor();
con.setAccessible(true);
o = con.newInstance();
return o;
}
private Object NewInstanceLazyBean(String id, Class<?> cls){
Object o = null;
o = newInstanceBean(cls);
instanceMap.put(id, o);
return o;
}
public <T>T getBean(String id, Class<T> cls){
Object o = instanceMap.get(id);
if(o == null)
o = NewInstanceLazyBean(id, cls); //懒加载对象实例化
return (T)o;
}
public Integer getBeanMapSize(){
return beanMap.size();
}
public Integer getInstanceMapSize(){
return instanceMap.size();
}
public static void main(String[] args){
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("spring-config.xml");
HelloService h = ac.getBean("hello", HelloService.class);
h.hello();
System.out.println("beanMap size: "+ac.getBeanMapSize());
System.out.println("instanceMap size: "+ac.getInstanceMapSize());
}
}
执行结果:
hello Spring IoC... !!!
beanMap size: 2 // 对懒加载进行验证
instanceMap size: 1
Process finished with exit code 0
编辑难免会有出错,如果您发先错误可以私信给我帮忙改正,为了传播没有错误的知识。
如果对您有帮助!!!
点个赞、点个赞、点个赞
收个藏、收个藏、收个藏
您的支持就是我的动力谢谢!!!