模拟简单的SpringIOC

       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就到此结束了。

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值