模拟一个简单的SpringIoc容器
我们只实现一个简单的接口。
//自定义一个接口
public interface BeanFactory {
//通过传进来的bean id获得相应的对象
public Object getBean(String id);
}
我们要解析的是这样的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="factory" class="com.bjsxt.spring.testbean.BeanFactory1"/>
<bean id="factory2" class="com.bjsxt.spring.testbean.BeanFactory2"/>
<bean id="bean" class="com.bjsxt.spring.beanfactory.bean.AttBean"/>
</beans>
下面是实现类:
/**
* 解析bean,模拟spring IOC的控制反转
*@author 莱格
*/
public class ClassPathXmlApplicationContext implements BeanFactory{
/**
* xml文件的默认path
* */
private static String xmlPath = null;
/**
* 加载配置文件
* */
public ClassPathXmlApplicationContext(String xmlPath) {
this.xmlPath = xmlPath;
}
/**
* 解析Xml文件
* @return 返回一个类的全限定名称
*/
private Map<String, Object> parseXml(String Path) {
SAXReader reader = new SAXReader();
try {
Map<String, Object> map = new HashMap<String,Object>();
//加载xml文件
Document document = reader.read(new FileInputStream(new File(Path)));
//获得根节点
Element root = document.getRootElement();
Iterator itr = root.elementIterator();
//迭代子元素
while(itr.hasNext()) {
//把下一个子元素强转成Element
Element element = (Element) itr.next();
//获得属性id的值
String key = (String) element.attribute(0).getData();
//获得属性class的值
String value = (String) element.attribute(1).getData();
map.put(key, value);
}
return map;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
//创建对像
@Override
public Object getBean(String id){
Map<String, Object> map = null;
String className = null;
map = parseXml(xmlPath);
if (map.get(id) == null) {
throw new RuntimeException("没有"+id+"资源!");
}
className = (String) map.get(id);
Object instance = BeanFactoryUtil.getInstance(className);
return instance;
}
}
/**
* 通过登记注册式获得静态工厂的单列
* 通过反射获得对象
*@author 莱格
*/
public class BeanFactoryUtil {
private static Map<String, Object> map = new HashMap<String,Object>();
public static Object getInstance(String className) {
try {
if (className == null) {
throw new RuntimeException("加载不到指定路径的类!");
}else {
Class clazz = Class.forName(className);
//创建对象
Object instance = clazz.newInstance();
//把对象放入map集合
map.put(className, instance);
}
return map.get(className);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
/**
* 对外提供的访问接口
* 根据所传入的路径获得对象
*@author 莱格
*/
public class FactoryClient {
/**
* 根据所传的配置文件路径和id获取到相应的对象
* @param xmlUrl applicationContext.xml文件的具体路径
* @param id bean的id
* @return 返回一个 Object对像
* @author 莱格
* */
public static Object getInstance(String xmlUrl,String id) {
BeanFactory factory = new ClassPathXmlApplicationContext(xmlUrl);
Object object = factory.getBean(id);
return object;
}
}
下面是测试类:
/**
* 测试ioc, 测试全部通过
*@author 莱格
*/
public class BeanTest {
@Test
public void test() {
BeanFactory1 b = (BeanFactory1) FactoryClient.getInstance("applicationContext.xml", "factory");
b.add();
}
@Test
public void test01() {
AttBean bean = (AttBean) FactoryClient.getInstance("applicationContext.xml", "bean");
bean.setClassName("hello!");
String s = bean.getClassName();
System.out.println(s);
}
}