今天咱们自己写一个工程用于模拟spring的bean工厂,在spring中我们可以把类配置到applicationContext.xml文件中,然后就可以从beanFactoy中取出这个类的对象,这里需要用得到java中xml的解析技术,常用的有四种解析技术,我们这里用到的是jdom解析,首先需要在jdom的官网上www.jdom.org
下载
jdom的jar文件,把lib下的全部jar包引进和jdom.jar这个核心jar包引进就OK了.
下面直接上代码
交通工具接口
package com.soukenan.spring.factory;
public interface Vehicle {
public void run();
}
两个实现了这个接口的类
汽车类
package com.soukenan.spring.factory;
public class Car implements Vehicle{
@Override
public void run() {
System.out.println("我有四个轱辘,我可以跑的很快,,,,,,,");
}
}
火车类
package com.soukenan.spring.factory;
public class Train implements Vehicle{
@Override
public void run() {
System.out.println("我有很多的轱辘,我可以跑的非常非常的快,,,,,,");
}
}
spring的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans >
<bean id="car" class="com.soukenan.spring.factory.Car"></bean>
<bean id="train" class="com.soukenan.spring.factory.Train"></bean>
</beans>
BeanFactory接口
package com.soukenan.spring.factory;
public interface BeanFactory {
public Object getBean(String id);
}
实现了该接口的ClassPathXmlApplicationContext类
package com.soukenan.spring.factory;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
import org.jdom2.xpath.XPath;
public class ClassPathXmlApplicationContext implements BeanFactory {
public Map<String,Object> container = new HashMap<String,Object>();
public ClassPathXmlApplicationContext(String path) throws Exception{
SAXBuilder sb = new SAXBuilder(); www.2cto.com
Document doc = sb.build(this.getClass().getClassLoader().getResourceAsStream(path));
Element root = doc.getRootElement();
List list = XPath.selectNodes(root, "/beans/bean");
for (int i = 0; i < list.size(); i++) {
Element bean = (Element) list.get(i);
String id = bean.getAttributeValue("id");
String className = bean.getAttributeValue("class");
Object o = Class.forName(className).newInstance();
container.put(id, o);
}
}
@Override
public Object getBean(String id) {
return this.container.get(id);
}
}
各个文件的目录
测试主类
package com.soukenan.spring.factory;
import java.io.IOException;
import java.util.Properties;
public class Main {
public static void main(String[] args) throws IOException, InstantiationException, IllegalAccessException, Exception{
BeanFactory bf = new ClassPathXmlApplicationContext("applicationContext.xml");
Vehicle v = (Vehicle) bf.getBean("car");
v.run();
}
}