`
youngmaster
  • 浏览: 57101 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ATM取款机: 类 Spring IoC的一段程序注解

    博客分类:
  • XML
阅读更多

一段配置文件:

 

//applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans>
	<bean id="us" class="com.youngmaster.atm.UsRate">
		<property name="rate">
			<value>0.8</value>
		</property>
	</bean>
	
	<bean id="js" class="com.youngmaster.atm.JsRate">
		<property name="rate">
			<value>60</value>
		</property>
	</bean>
	
	<bean id="transfer" class="com.youngmaster.atm.TransferImp">
		<property name="rate">
			<ref bean="js"></ref>
		</property>
	</bean>

</beans>

 

创建一个基础接口:

 

//Rate.java

package com.youngmaster.atm;
/**
 * @author youngmaster
 * @E-mail:youngmaster.fly@gmail.com
 * @version myEclipse 6.6
 * @create time:Sep 15, 2009 8:55:21 AM
 */
public interface Rate {
	
	public double getRate();
}
 

 

实现 Rate 接口1:

 

//UsRate.java

package com.youngmaster.atm;
/**
 * @author youngmaster
 * @E-mail:youngmaster.fly@gmail.com
 * @version myEclipse 6.6
 * @create time:Sep 15, 2009 8:56:32 AM
 */
public class UsRate implements Rate {
	
	private double rate;
	
	public double getRate() {
		return rate;
	}

	public void setRate(double rate) {
		this.rate = rate;
	}

}
 

 

实现 Rate 接口2:

 

//JsRate.java

package com.youngmaster.atm;
/**
 * @author youngmaster
 * @E-mail:youngmaster.fly@gmail.com
 * @version myEclipse 6.6
 * @create time:Sep 15, 2009 8:57:53 AM
 */
public class JsRate implements Rate {

private double rate;
	
	public double getRate() {
		return rate;
	}

	public void setRate(double rate) {
		this.rate = rate;
	}

}
 

再创建一个接口,用以获得实际取款:

 

//Transfer.java

package com.youngmaster.atm;
/**
 * @author youngmaster
 * @E-mail:youngmaster.fly@gmail.com
 * @version myEclipse 6.6
 * @create time:Sep 15, 2009 8:58:36 AM
 */
public interface Transfer {
	
	public double getAcount(double amount);

}

 

实现其接口:

 

//TransferImp.java

package com.youngmaster.atm;
/**
 * @author youngmaster
 * @E-mail:youngmaster.fly@gmail.com
 * @version myEclipse 6.6
 * @create time:Sep 15, 2009 8:59:17 AM
 */
public class TransferImp implements Transfer{

	private Rate rate;

	public double getAcount(double amount) {
		
		return amount*rate.getRate();
	}

	public Rate getRate() {
		return rate;
	}

	public void setRate(Rate rate) {
		this.rate = rate;
	}
	
}
 

 

解析 XML:

 

//XmlBeanFactory.java

package com.youngmaster.atm;

import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
 * @author youngmaster
 * @E-mail:youngmaster.fly@gmail.com
 * @version myEclipse 6.6
 */
public class XmlBeanFactory {

	private String file;

	public XmlBeanFactory(String file) {
		this.file = file;
	}

	public Object getBean(String id) {

		Object result = null;

		DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
				.newInstance();

		try {
			DocumentBuilder documentBuilder = documentBuilderFactory
					.newDocumentBuilder();
			Document document = documentBuilder.parse(file);

			NodeList nodeList = document.getElementsByTagName("bean");

			/** 遍历xml中的bean */
			for (int i = 0; i < nodeList.getLength(); i++) {

				Element beanElement = (Element) nodeList.item(i);
				String beanid = beanElement.getAttribute("id");

				/**
				 * 通过参数中的id获得相应的bean
				 */
				if (id.equals(beanid)) {

					/**
					 * 获取到相应的类
					 */
					String clazz = beanElement.getAttribute("class");
					Class beanclazz = Class.forName(clazz);
					result = beanclazz.newInstance();

					/**
					 * 获得bean中的属性
					 */
					NodeList propertyList = beanElement
							.getElementsByTagName("property");

					/**
					 * 遍历属性
					 */
					for (int j = 0; j < propertyList.getLength(); j++) {

						Element propertyElement = (Element) propertyList
								.item(j);
						/**
						 * 获得属性中的 name
						 */
						String propertyname = propertyElement
								.getAttribute("name");
						/**
						 * 自省--非常关键 其参数为属性名与其上层的 bean 其实质为得到具体的属性信息
						 */
						PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
								propertyname, beanclazz);

						NodeList valuelist = propertyElement
								.getElementsByTagName("value");

						/**
						 * 获得id 为us or js的bean
						 */
						if (valuelist != null && valuelist.getLength() > 0) {

							Element valueelement = (Element) valuelist.item(0);

							String nodvalue = valueelement.getFirstChild()
									.getNodeValue();

							/**
							 * 由具体属性得到写方法
							 */
							Method writemethod = propertyDescriptor
									.getWriteMethod();

							/**
							 * 首参数为本层类对象,第二个为set()中参数
							 */
							writemethod.invoke(result, Double
									.parseDouble(nodvalue));

						}

						else {
							/**
							 * 获得id 为transfer的bean
							 */
							NodeList reflist = propertyElement
									.getElementsByTagName("ref");

							Element refelement = (Element) reflist.item(0);

							String beanid1 = refelement.getAttribute("bean");

							/**
							 * 递归调用
							 */
							Object tempobject = this.getBean(beanid1);

							Method wriMethod1 = propertyDescriptor
									.getWriteMethod();

							wriMethod1.invoke(result, tempobject);

						}

					}

				}
			}

		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IntrospectionException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}

		return result;
	}

}
 

 

测试类:

 

//AtmTest.java

package com.youngmaster.atm;

/**
 * @author youngmaster
 * @E-mail:youngmaster.fly@gmail.com
 * @version myEclipse 6.6
 * @create time:Sep 15, 2009 9:01:45 AM
 */
public class AtmTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		XmlBeanFactory beanfactory = new XmlBeanFactory(
				"applicationContext.xml");

		Transfer transfer = (Transfer) beanfactory.getBean("transfer");
		
		System.out.println("========================\n"+transfer.getAcount(100));
	}

}
 

 

很浅显易懂的一段代码,当然,如果用spring实现是极其容易的;

 

但对此代码的深入理解可以为学习spring的IoC起到抛砖引玉之效。

 

 

 

1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics