java 구현 Spring XML에서 java 클래스를 설정하는 방법

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();
	}
	
}
이상의 이 자바가 Spring을 실현하여 XML에서 자바 클래스를 설정하는 방법은 바로 편집자가 여러분에게 공유한 모든 내용을 참고할 수 있고 저희를 많이 사랑해 주시기 바랍니다.

좋은 웹페이지 즐겨찾기