`
youngmaster
  • 浏览: 58538 次
  • 性别: 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
分享到:
评论

相关推荐

    实验一 Springioc基本操作.docx

    SpringIOC是Spring Framework中的核心组件之一,负责管理应用程序中的对象、依赖关系和生命周期。 在 Spring IOC 中,对象的创建和管理是通过 BeanFactory 或 ApplicationContext 实现的。BeanFactory 是 Spring ...

    springIoc实现原理

    Spring Ioc(Inversion of Control,控制反转)是Spring框架的核心特性之一,它改变了传统应用程序中对象的创建和管理方式。在传统的软件设计中,对象的创建和依赖关系的维护通常由代码自身来完成,而在Spring Ioc中...

    Spring IoC简单示例-注解配置-Maven构建

    在本文中,我们将深入探讨Spring框架的核心特性——控制反转(Inversion of Control,简称IoC)和依赖注入(Dependency Injection,简称DI),以及如何通过注解配置和Maven项目构建来实现这一概念。Spring框架是Java...

    以注解方式模拟Spring IoC AOP

    模拟Spring的IoC,我们可以创建一个简单的容器类,其中包含一个Map来存储bean。然后使用注解处理器扫描带有特定注解(如`@Component`)的类,并将它们注册到容器中。当需要注入依赖时,容器可以解析注解并自动装配。...

    手写SpringIOC注解实现版本

    Spring IOC(Inversion of Control,控制反转)是Spring框架的核心组成部分,它负责管理应用程序中的对象。这个"手写Spring IOC注解实现版本"项目旨在帮助我们深入理解Spring框架的工作原理,通过实际动手实现来增强...

    Spring Ioc 注解 依赖注入

    ### Spring IoC与注解依赖注入详解 #### 一、Spring框架简介 Spring框架是由Rod Johnson创建的一个开源项目,最初是为了解决企业级应用开发中的复杂性问题而诞生的。Spring框架的核心特性包括IoC(Inversion of ...

    Spring通过注解实现IOC

    Spring框架是Java开发中广泛应用的一个轻量级框架,它的核心特性之一就是依赖注入(Dependency Injection,简称DI),而实现DI的一种重要方式就是通过注解(Annotations)。本文将深入探讨Spring如何利用注解来实现...

    springIOC小程序

    在"springIOC小程序"中,我们可以看到这是一个基于Spring框架的小型Web应用程序示例。它包含了JAR包,意味着开发者可能已经预编译了所有必要的类,并打包在一起,便于直接导入和运行。这使得初学者或开发者能够快速...

    模拟Spring的IoC容器实现注解自动装配

    而注解自动装配(Autowired)是Spring IoC容器的一种高级特性,它允许我们通过注解来声明对象之间的依赖,无需手动编写XML配置。现在,我们将深入探讨如何模拟Spring的IoC容器实现注解自动装配。 首先,我们需要...

    spring ioc和aop原理流程图(详细)

    Spring 框架是Java开发中的核心框架,它主要由两个关键部分组成:IOC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)。这两个概念是Spring框架的核心特性,极大地简化了企业...

    SpringIoc示例代码

    1. **Bean定义**:在Spring中,一个Java类可以被声明为一个Bean,这可以通过XML配置文件中的`&lt;bean&gt;`标签实现,或者使用`@Component`、`@Service`、`@Repository`、`@Controller`等注解。Bean定义包含了类名、属性值...

    JavaEE Spring IoC注解

    JavaEE Spring 框架是企业级应用开发的首选之一,其核心特性之一就是Inversion of Control(IoC,控制反转)容器。IoC通过管理对象的生命周期和依赖关系,帮助开发者实现松耦合,提高代码的可测试性和可维护性。在...

    springioc的详细讲解

    Spring IOC,全称为Inversion of Control,即控制反转,是Spring框架的核心特性之一。它将对象的创建和管理从应用程序代码中分离出来,使得应用程序不再负责对象的生命周期,而是由Spring容器来负责。这种设计模式...

    springIOC核心组件分析.vsdx

    spring-context-indexer:类管理组件和Classpath扫描 spring-expression:表达式语句 切面编程: spring-aop:面向切面编程,CGLB,JDKProxy spring-aspects:集成AspectJ,Aop应用框架 spring-instrume

    SpringIOC经典Demo

    Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性,它极大地简化了Java应用的开发,通过将对象的创建和管理交由Spring容器来处理,开发者可以更专注于业务逻辑。下面,我们将深入探讨Spring IOC...

    spring ioc思维导图源文件

    Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性之一,它允许开发者将对象的创建和管理交给Spring容器来处理,从而使代码更加松耦合,更易于测试和维护。下面将详细介绍Spring IOC的基本概念、...

    JavaEE spring IoC入门案例

    IoC是一种设计模式,它将对象的创建和管理从应用程序的业务逻辑中分离出来,使得代码更加模块化,更易于测试和维护。Spring通过IoC容器实现了这一模式,大大提升了软件的可扩展性和可维护性。 在Spring框架中,IoC...

    Java反射_Spring IOC

    Java反射和Spring IOC是Java开发中的两个重要概念,它们在构建灵活、可扩展的应用程序时起着关键作用。本文将深入探讨这两个主题,并提供相关的学习资源。 首先,让我们了解一下Java反射。Java反射机制是Java语言的...

    Spring IoC依赖包

    Spring IoC,全称为Inversion of Control,即控制反转,是Spring框架的核心特性之一。它是一种设计模式,改变了传统程序中的对象创建和管理的方式,将对象的生命周期管理交由Spring容器来负责,使得代码更加解耦,...

    Spring中IoC优点与缺点解析

    IoC(Inversion of Control)是 Spring 框架中的一种设计模式,它的主要思想是将对象的创建和管理交给容器,从而解耦合对象之间的依赖关系。今天,我们将详细解析 IoC 的优点和缺点。 优点 1. 简化对象的创建:IoC ...

Global site tag (gtag.js) - Google Analytics