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();
	}

}

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

(0)

相关推荐

  • spring基础系列之JavaConfig配置详解

    早以前,Spring推荐使用XML的方式来定义Bean及Bean之间的装配规则,但是在Spring3之后,Spring提出的强大的JavaConfig这种类型安全的Bean装配方式,它基于Java代码的灵活性,使得装配的过程也变得及其灵活. 使用JavaConfig来装配Bean拥有其自己的一套规则,我们在这里来看一看: 1.规则 规则一:@Configuration注解 我们在定义JavaConfig类时,都会在其上加注@Configuration注解,来表明这是一个配置类,@Configur

  • 详解Spring中使用xml配置bean的细节

    整理总结刚学的关于spring的xml配置bean的知识. 在ApplicationContext.xml文件中使用bean节点配置bean,bean的属性id在IOC容器中必须是唯一的. <bean id="helloWorld" class="com.test.spring.beans.HelloWorld"> <property name="name" value="Spring"></pr

  • 详解Spring Aop实例之xml配置

    AOP的配置方式有2种方式:xml配置和AspectJ注解方式.今天我们就来实践一下xml配置方式. 我采用的jdk代理,所以首先将接口和实现类代码附上 package com.tgb.aop; public interface UserManager { public String findUserById(int userId); } package com.tgb.aop; public class UserManagerImpl implements UserManager { publ

  • Spring实战之XML与JavaConfig的混合配置详解

    前言 之前提到了关于Spring的显示配置方式有两种,一种是基于XML配置,一种是基于JavaConfig的方式配置.对于这两种配置方式并不是互斥关系,相反,他们两能够相互融合,有效的搭配完成Spring的bean注入. 这里分别介绍如何在JavaConfig中引用XML配置的bean以及如何在XML配置中引用JavaConfig.下面话不多说,来一起看看详细的介绍吧. 一.JavaConfig中引用XML配置的bean 上篇我们看到配置类CDPlayerConfig具体代码如下 @Config

  • Spring的注解配置与XML配置之间的比较

    注释配置相对于 XML 配置具有很多的优势:它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作.如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO 的属性名.类型等信息,如果关系表字段和 PO 属性名.类型都一致,您甚至无需编写任务属性映射信息--因为这些信息都可以通过 Java 反射机制获取. 注释和 Java 代码位于一个文件中,而 XML 配置采用独立的配置文件,大多数配置信息在程序开发完成后都不会调整,如果配置信息和 Java 代码放在一起,

  • 详解Spring中的JavaConfig注解

    前言 大家都知道传统spring一般都是基于xml配置的,不过后来新增了许多JavaConfig的注解.特别是springboot,基本都是清一色的java config,不了解一下,还真是不适应.这里备注一下. @RestController spring4为了更方便的支持restfull应用的开发,新增了RestController的注解,比Controller注解多的功能就是给底下的RequestMapping方法默认都加上ResponseBody注解,省得自己再去每个去添加该注解. @C

  • 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.

  • Java开发中读取XML与properties配置文件的方法

    相关阅读: 使用Ajax进行文件与其他参数的上传功能(java开发) 1. XML文件: 什么是XML?XML一般是指可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言. 2.XML文件的优点: 1)XML文档内容和结构完全分离. 2)互操作性强. 3)规范统一. 4)支持多种编码. 5)可扩展性强. 3.如何解析XML文档: XML在不同的语言中解析XML文档都是一样的,只不过实现的语法不一样,基本的解析方式有两种,一种是SAX方式,是按照XML文件的顺序一

  • java实现字符串四则运算公式解析工具类的方法

    项目中用到用户定义运算公式进行就算的需求,这样需要进行字符串四则运算解析,下面提供字符串公式四则运算解析与计算工具类,需要的同学可参考. 工具类如下:FormulaCalculator.java: package org.nercita.bcp.record.util; import java.util.ArrayList; import java.util.LinkedList; /** * @author zhangwenchao * @since 2016-08-26 * 公式计算的工具类

  • Spring根据XML配置文件注入属性的方法

    方法一使用setter方法 package com.swift; public class Book { private String bookName; public void setBook(String bookName) { this.bookName = bookName; } @Override public String toString() { return "Book [book=" + bookName + "]"; } } 在Spring框架中

  • C#实现基于XML配置MenuStrip菜单的方法

    本文实例讲述了C#实现基于XML配置MenuStrip菜单的方法.分享给大家供大家参考.具体如下: 1.关于本程序的说明 用XML配置MenuStrip菜单,本程序只是提供一个思路.程序在Load函数中根据XML文件中的设置动态生成一个MenuStrip组件的Items集合. 程序示例如下: 2.使用到的XML文档示例 <?xml version="1.0" encoding="gb2312"?> <!--MenuStrip:mnsMainMenu

  • 在Java的Spring框架中配置Quartz的教程

    Spring中配置Quartz的过程: 1.导入JAR包 quartz需要的JAR包,已经包含在spring中,位置在spring解压后目录的 \lib\quartz 下的quartz-all-1.6.1.jar, 将其拷贝到工程 的 WEB-INF/lib 下就行了. 2.配置web.xml,让spring启动时加载quartz的配置文件 <?xml version="1.0" encoding="UTF-8"?> <web-app versio

  • Spring框架 XML配置事务控制的步骤操作

    目录 基于 XML 的声明式事务控制 1.环境搭建 2.创建 spring 的配置文件并导入约束 3.准备数据库表和实体类 4.业务层接口与实现类 5.数据访问层接口与实现类 6.配置c3p0数据源/业务层/数据访问层 7.配置事务管理器 8.配置事务的通知 9.配置 AOP 切入点表达式 10.配置切入点表达式和事务通知的对应关系 基于 XML 的声明式事务控制 1.环境搭建 拷贝必要的 jar 包到工程的 lib 目录 2.创建 spring 的配置文件并导入约束 这里直接给出本次测试的全部

  • java 注解实现一个可配置线程池的方法示例

    前言 项目需要多线程执行一些Task,为了方便各个服务的使用.特意封装了一个公共工具类,下面直接撸代码: PoolConfig(线程池核心配置参数): /** * <h1>线程池核心配置(<b style="color:#CD0000">基本线程池数量.最大线程池数量.队列初始容量.线程连接保持活动秒数(默认60s)</b>)</h1> * * <blockquote><code> * <table bord

  • 详解Java如何使用注解来配置Spring容器

    目录 介绍 @Bean and @Configuration AnnotationConfigApplicationContext实例化容器 通过使用 register(Class...) 以编程方式构建容器 @ComponentScan启用组件扫描 Bean的依赖 生命周期回调 Bean指定作用域 自定义bean名称 Bean别名 Bean注入之间的依赖 @Import @ImportResource @PropertySource 支持多个properties文件 ApplicationCo

  • java Quartz定时器任务与Spring task定时的几种实现方法

    一.分类 从实现的技术上来分类,目前主要有三种技术(或者说有三种产品): 1.Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行.一般用的较少,这篇文章将不做详细介绍. 2.使用Quartz,这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行,配置起来稍显复杂,稍后会详细介绍. 3.Spring3.0以后自带的task,可以将它看成一

随机推荐