Geronimo XBen
1 Overview XBeanはAache Geronimoのサブプロジェクトで、Eclipse IDEのようにプラグインベースのサーバーを作成するのが目標です.現状から見ると、XBeanはSpring配置を簡略化するために多く使われている.例えば、Aache ActiveMQの構成はXBeanに基づく.2 Custom namespace 最も簡単なcustom namespaceはjava:/全パスのパケット名を加える形式で、以下は簡単な例である.
3 Custom mapping 前の例では、Productクラスにidというint型メンバー変数を追加すると、標準Spring属性との競合を避けるために、custom mappingが使われるべきである.まずMETA-INF/services/org/apache/xbean/spring/ディレクトリの下に$namespaceという属性ファイルを作成します.例えば、namespaceがhttp://xbean.versus.com/productMETA-INF/services/org/apache/xbean/spring/http/xbean.versus.com/productファイルを作成する必要があります.その内容は以下の通りです.
4コントロ-ラinjection setter注入以外にも、XBeanはconstructor注入をサポートしています.以下は簡単な例です.
5 Asssembing collection Springと同様に、XBeanも集合タイプに対応しています.以上の例では、FX毎に取引された商品に複数のレバーがあると仮定すると、以下のような修正が必要となる.
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はcomp.versus.misc.xbeanパッケージの一つである.Productクラスのメンバー変数はXMLの属性にマッピングされます.注意しなければならないのは、org.xbean.spring.co ntxt.lassPathXml Apple Contectを使用しなければなりません.Springが持っているApplication Contextではありません.3 Custom mapping 前の例では、Productクラスにidというint型メンバー変数を追加すると、標準Spring属性との競合を避けるために、custom mappingが使われるべきである.まずMETA-INF/services/org/apache/xbean/spring/ディレクトリの下に$namespaceという属性ファイルを作成します.例えば、namespaceがhttp://xbean.versus.com/productMETA-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コントロ-ラ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 Asssembing collection 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());
}
}