`
whitesock
  • 浏览: 484429 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Geronimo XBean

阅读更多

1 Overview
    XBean是Apache Geronimo的子项目,目标是像Eclipse IDE那样,用于创建基于插件的服务器(跟Geronimo GBean的目标有些重合)。从现状来看,XBean更多地被用于简化Spring 配置。例如,Apache ActiveMQ的配置基于XBean。

2 Custom namespace
    最简单的custom namespace是java://加上全路径包名的形式,以下是个简单的例子:

package com.versus.misc.xbean;

import java.math.BigDecimal;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

public class Product {
	private String name;
	private BigDecimal price;

	public String toString() {
		return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
		.append("name", name)
		.append("price", price).toString();
	}
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public BigDecimal getPrice() {
		return price;
	}

	public void setPrice(BigDecimal price) {
		this.price = price;
	}
}

    以下是配置文件xbean.xml的内容:

<beans xmlns:p="java://com.versus.misc.xbean">
  <p:Product id="product" name="USD/JPY" price="100.00"/>
</beans>

    以下是测试用的test case:

package com.versus.misc.xbean;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

import java.math.BigDecimal;

import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
import org.junit.Test;

public class XBeanTest {

	@Test
	public void test() {
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:com/versus/misc/xbean/xbean.xml");
		Product product = (Product)context.getBean("product");
		assertNotNull(product);
		assertEquals("USD/JPY", product.getName());
		assertEquals(new BigDecimal("100.00"), product.getPrice());
	}
}

    以上的例子中,custom namespace是java://com.versus.misc.xbean;Product是定义在com.versus.misc.xbean包中的一个类;Product类的成员变量都被映射成XML的属性。需要注意的是,必须使用org.xbean.spring.context.ClassPathXmlApplicationContext,而不是Spring自带的ApplicationContext。

 

3 Custom mapping
    在之前的例子中,如果给Product类增加一个名为id的int型成员变量,那么为了避免和标准Spring属性的冲突,应该使用custom mapping。首先要在META-INF/services/org/apache/xbean/spring/目录下建立一个名为$namespace的属性文件。例如,如果namespace是http://xbean.versus.com/product,那么需要建立META-INF/services/org/apache/xbean/spring/http/xbean.versus.com/product文件,其内容如下:

package = com.versus.misc.xbean
product = com.versus.misc.xbean.Product
product.alias.productId = id #将id成员变量映射为productId属性

    以下是配置文件xbean.xml的内容:

<beans xmlns:p="http://xbean.versus.com/product" >
  <p:product id="product" productId="1" name="USD/JPY" price="100.00"/>
</beans>

    以下是测试用的test case:

package com.versus.misc.xbean;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

import java.math.BigDecimal;

import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
import org.junit.Test;

public class XBeanTest {

	@Test
	public void test() {
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:com/versus/misc/xbean/xbean.xml");
		Product product = (Product)context.getBean("product");
		assertNotNull(product);
		assertEquals(1, product.getId());
		assertEquals("USD/JPY", product.getName());
		assertEquals(new BigDecimal("100.00"), product.getPrice());
	}
}

 

4 Constructor injection
    除了setter注入之外,XBean也支持constructor注入,以下是个简单的例子:

package com.versus.misc.xbean;

import java.math.BigDecimal;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

public class Product {
	private int id;
	private String name;
	private BigDecimal price;
	private Leverage leverage;

	public String toString() {
		return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
		.append("id", id)
		.append("name", name)
		.append("price", price)
		.append("leverage", leverage).toString();
	}
	
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public BigDecimal getPrice() {
		return price;
	}

	public void setPrice(BigDecimal price) {
		this.price = price;
	}

	public Leverage getLeverage() {
		return leverage;
	}

	public void setLeverage(Leverage leverage) {
		this.leverage = leverage;
	}
}
 
package com.versus.misc.xbean;

import java.math.BigDecimal;

public class Leverage {
	private int value;
	private BigDecimal margin;
	
	public Leverage(int value, BigDecimal margin) {
		this.value = value;
		this.margin = margin;
	}
	
	public int getValue() {
		return value;
	}
	
	public BigDecimal getMargin() {
		return margin;
	}
}

    META-INF/services/org/apache/xbean/spring/http/xbean.versus.com/product文件的内容如下:

package = com.versus.misc.xbean
product = com.versus.misc.xbean.Product
leverage = com.versus.misc.xbean.Leverage
product.alias.productId = id
com.versus.misc.xbean.Leverage(int,java.math.BigDecimal).parameterNames=value margin

    以下是配置文件xbean.xml的内容:

<beans xmlns:p="http://xbean.versus.com/product">
  <p:product id="product" productId="1" name="##USD/JPY" price="100.00" leverage="#leverage"/>
  <p:leverage id="leverage" value="50" margin="12345"/>
</beans>

    以下是测试用的test case:

package com.versus.misc.xbean;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

import java.math.BigDecimal;

import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
import org.junit.Test;

public class XBeanTest {

	@Test
	public void test() {
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:com/versus/misc/xbean/xbean.xml");
		
		Product product = (Product)context.getBean("product");
		assertNotNull(product);
		assertEquals(1, product.getId());
		assertEquals("#USD/JPY", product.getName());
		assertEquals(new BigDecimal("100.00"), product.getPrice());
		
		Leverage leverage = (Leverage)context.getBean("leverage");
		assertNotNull(leverage);
		assertEquals(50, leverage.getValue());
		assertEquals(new BigDecimal("12345"), leverage.getMargin());
		
		assertEquals(leverage, product.getLeverage());
	}
}

    需要注意的是,以上例子中p:product的leverage属性通过#引用了leverage。如果你期望配置一个以#开头的字符串,那么字符串的需要以##开头(例如以上例子中,product中name成员变量的值是#USD/JPY)。

 

5 Assembling collections
    跟Spring一样,XBean也支持装配集合类型。以上的例子中,假设每种FX交易的商品可以有多个杠杆,那么需要进行以下的修改:

package com.versus.misc.xbean;

import java.math.BigDecimal;
import java.util.List;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

public class Product {
	private int id;
	private String name;
	private BigDecimal price;
	private List<Leverage> leverages;

	public String toString() {
		return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
		.append("id", id)
		.append("name", name)
		.append("price", price)
		.append("leverages", leverages).toString();
	}
	
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public BigDecimal getPrice() {
		return price;
	}

	public void setPrice(BigDecimal price) {
		this.price = price;
	}

	public List<Leverage> getLeverages() {
		return leverages;
	}

	public void setLeverages(List<Leverage> leverages) {
		this.leverages = leverages;
	}
}

    META-INF/services/org/apache/xbean/spring/http/xbean.versus.com/product文件的内容如下:

package = com.versus.misc.xbean
product = com.versus.misc.xbean.Product
leverage = com.versus.misc.xbean.Leverage
product.alias.productId = id
product.alias.leverages.list = leverages
com.versus.misc.xbean.Leverage(int,java.math.BigDecimal).parameterNames=value margin

    以下是配置文件xbean.xml的内容:

<beans xmlns:p="http://xbean.versus.com/product">
  <p:product id="product" productId="1" name="USD/JPY" price="100.00">
      <leverages>
          <p:leverage id="leverage1" value="50" margin="12345"/>
          <p:leverage id="leverage2" value="100" margin="24690"/>
      </leverages>
  </p:product>
</beans>

    以下是测试用的test case:

package com.versus.misc.xbean;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

import java.math.BigDecimal;

import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
import org.junit.Test;

public class XBeanTest {

	@Test
	public void test() {
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:com/versus/misc/xbean/xbean.xml");
		
		Product product = (Product)context.getBean("product");
		assertNotNull(product);
		assertEquals(1, product.getId());
		assertEquals("USD/JPY", product.getName());
		assertEquals(new BigDecimal("100.00"), product.getPrice());
		assertEquals(2, product.getLeverages().size());
		
		Leverage leverage1 = product.getLeverages().get(0);
		assertNotNull(leverage1);
		assertEquals(50, leverage1.getValue());
		assertEquals(new BigDecimal("12345"), leverage1.getMargin());
		
		Leverage leverage2 = product.getLeverages().get(1);
		assertNotNull(leverage2);
		assertEquals(100, leverage2.getValue());
		assertEquals(new BigDecimal("24690"), leverage2.getMargin());
	}
}
8
0
分享到:
评论

相关推荐

    xbean简化spring配置文件.doc

    xbean是 Apache Geronimo 项目的一个子项目,旨在简化Spring配置文件的编写。下面我们来详细介绍如何使用xbean简化Spring配置文件。 在Spring之前,我们使用Factory模式来管理bean。例如,我们可以定义一个Human...

    geronimo

    Apache Geronimo是一个开放源代码服务器运行时,它集成了最佳的开放源代码项目,以创建满足企业开发人员和系统管理员需求的Java / OSGi服务器运行时。...https://mirrors.tuna.tsinghua.edu.cn/apache/geronimo/xbean/

    poi解析2007报错替换包

    3. **geronimo-stax-api_1.0_spec-1.0.jar**:这个是Apache Geronimo对STAX(Streaming API for XML)规范的实现。STAX是一种处理XML的API,它允许程序以事件驱动的方式读取和写入XML,相比DOM更加高效,因为它不...

    ActiveMQ与Spring线程池整合实例

    ActiveMQ与Spring线程池整合的一个实例。 lib库没有上传。 ... lib中包含: apache-activemq-4.1.1.jar backport-util-concurrent-2.1.jar commons-lang-2.0.jar commons-logging-1.0.4.jar ...xbean-spring-2.8.jar

    activemq-rar-4.1.2.rar

    6. **xbean-spring-3.0.jar**:XBean是一个XML处理库,特别用于加载Spring配置文件,使得ActiveMQ可以使用Spring的XML配置进行初始化。 7. **activeio-core-3.0.1.jar**:ActiveIO是ActiveMQ的一个子项目,提供高...

    开发常用jar6

    3. **geronimo**:Apache Geronimo是Apache软件基金会的一个开源项目,它提供了完整的Java EE服务器实现,使得开发者可以部署和管理各种服务和应用程序。 4. **zookeeper**:Apache ZooKeeper是一个分布式的,开放...

    activemq-rar-5.4.0.rar

    - `xbean-spring-3.7.jar`:XBean是Apache软件基金会的一个项目,提供了一种加载Spring配置文件的方法,使得Spring配置可以直接应用于服务器环境。 - `spring-core-3.0.3.RELEASE.jar`, `spring-beans-3.0.3....

    activemq-rar-4.1.1.rar

    6. **xbean-spring-2.8.jar**:XBean是Apache项目的一部分,它是一个XML解析和实例化库,特别用于Spring框架,使得Spring可以加载XML配置文件来创建对象。 7. **activeio-core-3.0.0-incubator.jar**:ActiveIO是...

    activemq-rar-5.5.1.rar

    4. **xbean-spring-3.7.jar**:XBean是Spring的一个扩展,用于加载和管理Spring配置文件中的XML资源,使得Spring可以动态加载和管理服务。 5. **spring-core-3.0.3.RELEASE.jar, spring-beans-3.0.3.RELEASE.jar**:...

    activemq-rar-5.0.0.rar

    5. **geronimo-j2ee-management_1.0_spec-1.0.jar**:这是Geronimo项目提供的J2EE管理规范实现,用于监控和管理Java EE应用服务器。 6. **log4j-1.2.14.jar**:经典的日志记录库,用于应用程序的日志输出和管理。 ...

    java 解析excel jar包

    6. geronimo-stax-api_1.0_spec-1.0.jar:这是Apache Geronimo提供的STAX(Streaming API for XML)规范实现,用于高效地读写XML流。 在使用这些库解析Excel文件时,首先需要导入对应的jar包到项目中。然后,可以...

    eclipse 3.2.2上配置Axis2开发环境

    - `geronimo-activation_1.1_spec-1.0-M1.jar` - `jibx-bind-1.1.5.jar` - `log4j-1.2.14.jar` - `neethi-2.0.2.jar` - `woden-1.0-incubating-M7b.jar` - `wsdl4j-1.6.2.jar` - `xbean-2.2.0.jar` - `XmlSchema-...

    Jetty中文手册

    如何使用XBean来配置Jetty 客户端 Asynchronous HTTP Client教程 日志 / 监控 如何配置Request Logs 如何配置自定义错误页面(Custom Error Pages) 配置Jetty Statistics(统计) 配置Jetty Statistics教程 配置...

    开发用jar包合集

    geronimo-annotation_1.0_spec-1.0.jar gradle-announce-2.3-rc-2.jar gradle-antlr-2.3-rc-2.jar gradle-base-services-2.3-rc-2.jar gradle-base-services-groovy-2.3-rc-2.jar gradle-build-comparison-2.3...

Global site tag (gtag.js) - Google Analytics