java实现Spring在XML配置java类的方法

所属分类: 软件编程 / java 阅读数: 37
收藏 0 赞 0 分享

1. 创建自己的bean文件:beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<busi-beans>
	<beans>
		<bean id="SysHelloImpl" type="com.cxm.test.SysHello">
			<desc>test</desc>
			<impl-class>com.cxm.test.SysHelloImpl</impl-class>
		</bean>		
	</beans>		
</busi-beans>

2. 提供解析xml类:XmlUtils

/**
 * 
 */
package com.cxm.xmlutil;

import java.io.InputStream;
import java.util.Iterator;
import java.util.Map;

import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.xpath.XPath;

import com.cxm.beaninfo.BeanInfo;



/**
 * @author admin
 * 
 */
public class XmlUtils
{
	
	public static void parseXmlDef(InputStream in, Map<String,BeanInfo> beanDefMap,
			StringBuffer sb) throws Exception
	{
		SAXBuilder reader = new SAXBuilder(false);
		Document doc = null;
		try
		{
			doc = reader.build(in);
			Iterator beanIt = XPath.selectNodes(doc, "/busi-beans/beans/bean")
					.iterator();
			Element e;
			BeanInfo beanDef;
			while (beanIt.hasNext())
			{
				beanDef = new BeanInfo();
				e = (Element) beanIt.next();
				Attribute attrId = e.getAttribute("id");
				Attribute attrType = e.getAttribute("type");
				Attribute singleType = e.getAttribute("single");
				boolean isSingle = true;
				if(null != singleType&&"1".equals(singleType.getValue())){
					isSingle= false;
				}
				beanDef.setSingle(isSingle);
				beanDef.setBeanId(attrId.getValue());
				beanDef.setType(attrType.getValue());
				beanDef.setBeanDesc(getText(e, "desc"));
				beanDef.setImplClassName(getText(e, "impl-class"));
				//处理初始化参数
				beanDefMap.put(attrId.getValue(), beanDef);
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}
	
	/**
	 * 根据指定的element, xPath获取XML文档内容
	 * 
	 * @param p_element
	 * @param p_xPath
	 * @return
	 * @throws Exception
	 */
	public static String getText(Element p_element, String p_xPath)
			throws Exception {
		String text = null;
		Element e=(Element)XPath.selectSingleNode(p_element,p_xPath);
		if (e != null) {
			text = e.getText();
		} else {
		}
		return text;
	}
}

3.定义bean IO

/**
 * 
 */
package com.cxm.beaninfo;

/**
 * @author admin
 *
 */
public class BeanInfo
{
	private String beanId;
	
	private String type;
	
	private String beanDesc;
	
	public String getBeanDesc()
	{
		return beanDesc;
	}

	public void setBeanDesc(String beanDesc)
	{
		this.beanDesc = beanDesc;
	}

	public String getType()
	{
		return type;
	}

	public void setType(String type)
	{
		this.type = type;
	}

	private String implClassName;
	
	public String getBeanId()
	{
		return beanId;
	}

	public void setBeanId(String beanId)
	{
		this.beanId = beanId;
	}
	
	public String getImplClassName()
	{
		return implClassName;
	}

	public void setImplClassName(String implClassName)
	{
		this.implClassName = implClassName;
	}

	public boolean isSingle()
	{
		return isSingle;
	}

	public void setSingle(boolean isSingle)
	{
		this.isSingle = isSingle;
	}

	private boolean isSingle = true;
	
}

4.bean的创建类:BeanUtil

/**
 * 
 */
package com.cxm.bean;



/**
 * @author admin
 *
 */
public class BeanUtil
{
	private static XmlBeanFactory factory = new XmlBeanFactory();
	/**
	 * 获取定义好的Bean对象
	 * @param p_beanId
	 * @return
	 * @throws Exception 
	 */
	public static Object createBean(String p_beanId)
			throws Exception {
		return factory.createBean(p_beanId);
	}
}

 

/**
 * 
 */
package com.cxm.bean;

import java.io.FileNotFoundException;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.util.HashMap;
import java.util.Map;

import com.cxm.beaninfo.BeanInfo;
import com.cxm.exception.NoSuchBeanDefinitionException;
import com.cxm.xmlutil.XmlUtils;

/**
 * @author admin
 *
 */
public class XmlBeanFactory
{
	private static String BEAN_XML = "/beans.xml";
	
	private static Map<String,BeanInfo> beanDefMap = new HashMap<String,BeanInfo>();
	
	private static Map<String,Object> instanceMap = new HashMap<String,Object>();
	
	static {
		InputStream in = XmlBeanFactory.class.getResourceAsStream(BEAN_XML);
		if(in ==null){
			try{
				throw new FileNotFoundException();
			}catch (FileNotFoundException e){
				e.printStackTrace();
			}
		}
		StringBuffer sb = new StringBuffer();
		try
		{
			XmlUtils.parseXmlDef(in, beanDefMap, sb);
		}
		catch (Exception e)
		{
			throw new RuntimeException();
		}
	}
	
	public Object createBean(String beanId) throws Exception{
		if(beanId==null || beanId.trim()==""){
			throw new Exception("BeanId can not NULL or '' ");
		}
		BeanInfo beanInfo = beanDefMap.get(beanId);
		if(null ==beanInfo ){
			throw new NoSuchBeanDefinitionException(" beanid is not define in xml");
		}
		Object instance;
		if(beanInfo.isSingle()){
			instance =instanceMap.get(beanId);
			if(null != instance){
				return instance;
			}
		}
		String implClass = beanInfo.getImplClassName();
		Constructor<?> constructor = Class.forName(implClass.trim()).getConstructor();
		instance = constructor.newInstance();
		if(beanInfo.isSingle()){
			instanceMap.put(beanId, instance);
		}
		return instance;
	}
}

5. 测试:

/**
 * 
 */
package com.cxm.test;

/**
 * @author admin
 *
 */
public interface SysHello
{
	void sysHello();
}

 

/**
 * 
 */
package com.cxm.test;

/**
 * @author admin
 *
 */
public class SysHelloImpl implements SysHello
{

	@Override
	public void sysHello()
	{
		System.out.println("hello world!");
		
	}
	
}

 

/**
 * 
 */
package com.cxm.test;

import com.cxm.bean.BeanUtil;

/**
 * @author admin
 *
 */
public class Test
{
	
	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception
	{
		SysHello s = (SysHello)BeanUtil.createBean("SysHelloImpl");
		s.sysHello();
	}
	
}

以上这篇java实现Spring在XML配置java类的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Java的面向对象编程基本概念学习笔记整理

这篇文章主要介绍了Java的面向对象编程基本概念学习笔记整理,包括类与方法以及多态等支持面向对象语言中的重要特点,需要的朋友可以参考下
收藏 0 赞 0 分享

Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法

这篇文章主要介绍了Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法 的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

基于Java实现杨辉三角 LeetCode Pascal's Triangle

这篇文章主要介绍了基于Java实现杨辉三角 LeetCode Pascal's Triangle的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Java中Spring获取bean方法小结

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,如何在程序中获取Spring配置的bean呢?下面通过本文给大家介绍Java中Spring获取bean方法小结,对spring获取bean方法相关知识感兴趣的朋友一起学习吧
收藏 0 赞 0 分享

如何计算Java对象占用了多少空间?

在Java中没有sizeof运算符,所以没办法知道一个对象到底占用了多大的空间,但是在分配对象的时候会有一些基本的规则,我们根据这些规则大致能判断出来对象大小,需要的朋友可以参考下
收藏 0 赞 0 分享

剖析Java中的事件处理与异常处理机制

这篇文章主要介绍了Java中的事件处理与异常处理机制,讲解Java是如何对事件或者异常作出响应以及定义异常的一些方法,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Java的Struts2框架的结构及其数据转移方式

这篇文章主要介绍了详解Java的Struts2框架的结构及其数据转移方式,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
收藏 0 赞 0 分享

Java封装好的mail包发送电子邮件的类

本文给大家分享了2个java封装好的mail包发送电子邮件的类,并附上使用方法,小伙伴们可以根据自己的需求自由选择。
收藏 0 赞 0 分享

在Java的Struts中判断是否调用AJAX及用拦截器对其优化

这篇文章主要介绍了在Java的Struts中判断是否调用AJAX及用拦截器对其优化的方法,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
收藏 0 赞 0 分享

java多线程Future和Callable类示例分享

JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。今天我们就来研究下Future和Callab
收藏 0 赞 0 分享
查看更多