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

所属分类: 软件编程 / java 阅读数: 31
收藏 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类的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

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

SpringBoot环境搭建及第一个程序运行(小白教程)

这篇文章主要介绍了SpringBoot环境搭建及第一个程序运行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

过滤器 和 拦截器的 6个区别(别再傻傻分不清了)

这篇文章主要介绍了过滤器 和 拦截器的 6个区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

SpringBoot整合SpringTask实现定时任务的流程

这篇文章主要介绍了SpringBoot整合SpringTask实现定时任务的流程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

vscode快速引入第三方jar包发QQ邮件

这篇文章主要介绍了vscode快速引入第三方jar包发QQ邮件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Java Enum和String及int的相互转化示例

这篇文章主要介绍了Java Enum和String及int的相互转化示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Spring boot如何快速的配置多个Redis数据源

这篇文章主要介绍了Spring boot如何快速的配置多个Redis数据源,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

JAVA 对接腾讯云直播的实现

这篇文章主要介绍了JAVA 对接腾讯云直播的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

JavaSE static final及abstract修饰符实例解析

这篇文章主要介绍了JavaSE static final及abstract修饰符实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

SpringBoot定时任务参数运行代码实例解析

这篇文章主要介绍了SpringBoot定时任务运行代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Spring Boot调用 Shell 脚本实现看门狗功能

这篇文章主要介绍了Spring Boot调用 Shell 脚本实现看门狗功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多