IOC(Inersion of Control)是Spring框架的基础,BeanFatory是IoC容器的核心借口,其职责是实例化、定位、配置应用程序中的对象与及建立这些对象之间的依赖。
ApplicationContext接口由BeanFactory派生而来,增强了BeanFactory的功能,提供更多的面向实际应用的方法。大多数情况下,使用ApplicatonContext作为Spring容器。下面模拟SpringIOC:
这是一个POJO类,Boy.java
package POJO;
public class Boy {
private Integer id;
private String name;
private Integer age;
public Boy(){}
//....省略getter跟setter
}
接下来写一个xml文件,spring.xml:
<?xml version="1.0" encoding="UTF-8"?> <beans> <bean id ="boy" class="POJO.Boy"> <property name="id" value="1"/> <property name="name" value="小男孩"/> <property name="age" value="11"/> </bean> </beans>
核心类:SpringIOC
public class SpringIOC {
private String XMLPath;
/**
* @param XMLPath
* 配置文件的路径
*/
public SpringIOC(String XMLPath) {
this.XMLPath = XMLPath;
}
public Object getBean(String beanId) throws Throwable {
// 1.解析配置文件
Document doc = this.loadXML();
// 2.根据beanId定位到<bean>标签
Element beanElement = this.getBeanElement(doc, beanId);
// 3.获取beanElement的class属性的值
String classPath = this.getClassPath(beanElement);
// 4.通过class属性值利用反射技术构造bean实例
Object obj = this.createObject(classPath);
// 5.使用beanUtils给对象设置
obj = this.setObeject(beanElement, obj);
return obj;
}
/**
* 加载xml配置文件
*
* @return
* @throws Throwable
*/
private Document loadXML() throws Throwable {
return new SAXReader().read(new File(XMLPath));
}
/**
* 根据beanId定位到对应的bean标签
*
* @param doc
* @param beanId
* @return Element
*/
private Element getBeanElement(Document doc, String beanId) {
return (Element) doc.selectSingleNode("//bean[@id='" + beanId + "']");
}
/**
* 得到beanElement的class属性值
*
* @param beanElement
* @return
*/
private String getClassPath(Element beanElement) {
return beanElement.attributeValue("class");
}
/**
* 通过class属性值利用反射技术构造bean实例
*
* @param classPath
* @return
*/
private Object createObject(String classPath) throws Throwable {
return Class.forName(classPath).newInstance();
}
/**
* 使用工具类beanUtils给对象设值
*
* @param obj
* @return
* @throws Throwable
*/
@SuppressWarnings("unchecked")
private Object setObeject(Element beanElement, Object obj) throws Throwable {
List<Element> list = beanElement.elements();
for (Element element : list) {
String name = element.attributeValue("name");
String value = element.attributeValue("value");
BeanUtils.setProperty(obj, name, value);
}
return obj;
}
}
注意:这里用dom4j解析xml,并且使用BeanUtils给对象设置属性,需要导入相应的jar包
测试类 TestSpringIOC.java
public class TestSpringIOC {
public static void main(String[] args) throws Throwable {
SpringIOC ioc = new SpringIOC("src/spring.xml");
Boy boy = (Boy) ioc.getBean("boy");
System.out.println(boy);
}
}
输出为:Boy [id=1, name=小男孩, age=11],简单的模拟SpringIOC就到此结束了。