bboss factory依赖注入模式使用方法

43 篇文章 0 订阅
32 篇文章 0 订阅
[size=large][b]1.bboss aop框架的工厂模式实现组件管理概述[/b][/size]

bboss aop框架的工厂模式是bbossgroups3.0新引入的一种组件创建机制,是对原有的属性注入模式和构造函数注入模式的很好补充。具体实现方式如下,在property元素上增加factory-bean、factory-class和factory-method三个属性,也就是对应property元素管理的组件实例通过factory-bean或者factory-class对应的组件中factory-method对应的方法来创建。factory-bean和factory-class的主要区别:
factory-bean 指定的值是一个组件id,对应aop组件配置文件中的其他组件的一个引用,同时factory-method指定的方法名称是这个组件的
一个实例方法,aop框架通过调用factory-bean对应的组件的factory-method对应的方法来创建组件实例。
factory-class 指定的是创建组件的工厂实现类的全路径,同时factory-method指定的方法名称是这个组件的一个静态或者实例方法,aop框架通过调用factory-class对应的组件的factory-method对应的方法来创建组件实例;当对应的方法是实例方法则首先创建factory-class类对应的工厂实例,如果配置了依赖注入属性,则会先注入这些属性到工厂实例中,然后在该工厂实例上调用factory-method对应的方法来创建组件实例。
如果factory-method指定的方法带有参数,可以通过construction节点包含property节点的方式来指定,多个property节点的排列顺序
要和方法参数的顺序一致,类型要可以转换。

具体的实例可以参考测试用例:
/bbossaop/test/org/frameworkset/spi/beans/factory
我们通过一个简单的案例来介绍工厂模式的使用方法,需要创建的组件为:
org.frameworkset.spi.beans.factory.TestBean
我们通过分别:
通过工厂组件org.frameworkset.spi.beans.factory.TestFactoryBeanCreate中的相关方法来创建TestBean的实例
通过工厂类org.frameworkset.spi.beans.factory.StaticBeanFactory中的相关静态方法来创建TestBean的实例。

下面介绍具体的程序和配置
[size=large][b]2.配置文件中如何配置工厂模式[/b][/size]
<!-- 
Warning: Factory pattern can not against loop ioc,while loop ioc occured , unknown exception will be throwed.
-->
<properties>
<!--
This is a webservice client example.
ApplicationContext context = ApplicationContext.getApplicationContext("org/frameworkset/spi/beans/factory/factorybean.xml");
ETLWebService etlWebService = (ETLWebService)context.getBeanObject("ETLWebService");
-->
<property name="ETLWebService" factory-bean="ETLWebServiceFactory" factory-method="create"/>

<property name="ETLWebServiceFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
<property name="serviceClass" value="org.frameworkset.monitor.etl.webservice.ETLWebService"/>
<property name="address" value="http://localhost/kettle/webservice/ETLWebServicePort"/>
</property>

<!--
bean [testbean] will be created used facctory method [createNoArgs] of factory bean [testfactorybean].
testfactorybean is defined by another composinent.
-->
<property name="testbeanCreateNoArgs" factory-bean="testfactorybean" factory-method="createNoArgs"/>
<!--
bean [testbean] will be created used facctory method [createWithArgs] of factory bean [testfactorybean].
testfactorybean is defined by another component.
constructions parameters will be used as the parameters of createWithArgs method.
-->
<property name="testbeanCreateByArgs" factory-bean="testfactorybean" factory-method="createWithArgs">
<construction>
<property name="name" value="duoduo"/>
<property name="id" value="12"/>
</construction>
</property>
<!--
bean [testbean] will be created used facctory method [createNoArgsThrowException] of factory bean [testfactorybean].
testfactorybean is defined by another component.
-->
<property name="testbeanCreateNoArgsThrowException" factory-bean="testfactorybean" factory-method="createNoArgsThrowException"/>
<!--
bean [testbean] will be created used factory method [createWithArgsThrowException] of factory bean [testfactorybean].
testfactorybean is defined by another component.
constructions parameters will be used as the parameters of createWithArgsThrowException method.
A Exception occur when call createWithArgsThrowException method and component created failed.
-->
<property name="testbeanCreateByArgsThrowException" factory-bean="testfactorybean" factory-method="createWithArgsThrowException">
<construction>
<property name="name" value="duoduo"/>
<property name="id" value="12"/>
</construction>
</property>

<property name="testfactorybean" class="org.frameworkset.spi.beans.factory.TestFactoryBeanCreate">
<property name="factorydata1" value="duoduo"/>
<property name="factorydata2" value="12"/>
</property>

<!-- createWithArgs method must be a static method of factory class org.frameworkset.spi.beans.factory.TestFactoryBeanCreate,
constructions parameters will be used as the parameters of createWithArgs method.-->
<property name="staticTestbeanCreateByArgs" factory-class="org.frameworkset.spi.beans.factory.StaticBeanFactory" factory-method="createWithArgs">
<construction>
<property name="name" value="duoduo"/>
<property name="id" value="12"/>
</construction>
</property>

<!-- createNoArgs method must be a static method of factory class org.frameworkset.spi.beans.factory.TestFactoryBeanCreate

-->
<property name="staticTestbeanCreateNoArgs" factory-class="org.frameworkset.spi.beans.factory.StaticBeanFactory" factory-method="createNoArgs"/>


<!-- createWithArgsThrowException method must be a static method of factory class org.frameworkset.spi.beans.factory.TestFactoryBeanCreate,
constructions parameters will be used as the parameters of createWithArgsThrowException method.
A Exception occur when call createWithArgsThrowException method and component created failed.
-->
<property name="staticTestbeanCreateByArgsThrowException" factory-class="org.frameworkset.spi.beans.factory.StaticBeanFactory" factory-method="createWithArgsThrowException">
<construction>
<property name="name" value="duoduo"/>
<property name="id" value="12"/>
</construction>
</property>

<!-- createNoArgsThrowException method must be a static method of factory class org.frameworkset.spi.beans.factory.TestFactoryBeanCreate
A Exception occur when call createNoArgsThrowException method and component created failed.
-->
<property name="staticTestbeanCreateNoArgsThrowException" factory-class="org.frameworkset.spi.beans.factory.StaticBeanFactory" factory-method="createNoArgsThrowException"/>


</properties>

对应的配置文件存放的地址:org/frameworkset/spi/beans/factory/factorybean.xml
[size=large][b]3.需要创建的组件[/b][/size]
package org.frameworkset.spi.beans.factory;

/**
* <p>Title: TestBean.java</p>
* <p>Description: </p>
* <p>bboss workgroup</p>
* <p>Copyright (c) 2007</p>
* @Date 2011-1-14 上午10:13:42
* @author biaoping.yin
* @version 1.0
*/
public class TestBean {
private String name;
private int id;

public TestBean(String name, int id) {

this.name = name;
this.id = id;
}

public TestBean() {
}

protected String getName() {
return name;
}

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

protected int getId() {
return id;
}

protected void setId(int id) {
this.id = id;
}
}



[size=large][b]4.管理组件的工厂[/b][/size]
静态工厂


package org.frameworkset.spi.beans.factory;

/**
* <p>Title: StaticBeanFactory.java</p>
* <p>Description: </p>
* <p>bboss workgroup</p>
* <p>Copyright (c) 2007</p>
* @Date 2011-1-14 上午10:55:07
* @author biaoping.yin
* @version 1.0
*/
public class StaticBeanFactory {

public static TestBean createWithArgs(String name,int id)
{
return new TestBean(name,id);
}


public static TestBean createNoArgs()
{
return new TestBean();
}


public static TestBean createWithArgsThrowException(String name,int id) throws Exception
{
throw new Exception("createWithArgsThrowException name:"+name+",id:" + id );
}


public static TestBean createNoArgsThrowException() throws Exception
{
throw new Exception("createWithArgsThrowException()");
}
}


组件工厂

package org.frameworkset.spi.beans.factory;

/**
* <p>Title: TestFactoryBeanCreate.java</p>
* <p>Description: </p>
* <p>bboss workgroup</p>
* <p>Copyright (c) 2007</p>
* @Date 2011-1-14 上午10:13:31
* @author biaoping.yin
* @version 1.0
*/
public class TestFactoryBeanCreate {
private String factorydata1;
private String factorydata2;
public TestBean createNoArgs()
{
return new TestBean();
}

public TestBean createWithArgs(String name,int id)
{
return new TestBean( name,id);
}


public TestBean createNoArgsThrowException() throws Exception
{
throw new Exception("createNoArgsThrowException " );
}

public TestBean createWithArgsThrowException(String name,int id) throws Exception
{
throw new Exception("createWithArgsThrowException name:"+name+",id:" + id );
}


public String getFactorydata1() {
return factorydata1;
}

public void setFactorydata1(String factorydata1) {
this.factorydata1 = factorydata1;
}

public String getFactorydata2() {
return factorydata2;
}

public void setFactorydata2(String factorydata2) {
this.factorydata2 = factorydata2;
}
}



[size=large][b]5.工厂类实例方法模式[/b][/size]
以hessian客户端作为示例来说明这种模式的使用方法,先看例子:

通过bboss-ioc 工厂类实例方法模式配置和获取客户端
<property name="clientservice" factory-class="com.caucho.hessian.client.HessianProxyFactory" 
f:connectionTimeout="360000"
f:readTimeout="36000"
factory-method="create">
<construction>
<property value="org.frameworkset.spi.remote.hession.server.ServiceInf"/>
<property value="http://localhost:8080/context/hessian?service=basicservice"/>
</construction>
</property>

获取客户端:
DefaultApplicationContext context = DefaultApplicationContext.getApplicationContext("org/frameworkset/spi/remote/hession/client/hessian-client.xml");
//获取客户端组件实例
ServiceInf basic = context.getTBeanObject("clientservice", ServiceInf.class);

说明:bboss-ioc 首先创建HessianProxyFactory的实例,然后设置这实例的connectionTimeout和readTimeout两个属性的值,最后调用工厂实例的create方法(传入serviceInterface和serviceAdress两个参数)获取组件实例(hessian客户端代理实例)。
[size=large][b]6.测试用例[/b][/size]
package org.frameworkset.spi.beans.factory;

import org.frameworkset.spi.ApplicationContext;
import org.junit.Before;
import org.junit.Test;

/**
* <p>Title: TestCase.java</p>
* <p>Description: </p>
* <p>bboss workgroup</p>
* <p>Copyright (c) 2007</p>
* @Date 2011-1-14 上午11:16:36
* @author biaoping.yin
* @version 1.0
*/
public class TestCase {
ApplicationContext context ;
@Before
public void initContext()
{
context = ApplicationContext.getApplicationContext("org/frameworkset/spi/beans/factory/factorybean.xml");

}
@Test
public void runCase()
{
TestBean bean = (TestBean) context.getBeanObject("testbeanCreateNoArgs");
TestBean bean1 = (TestBean) context.getBeanObject("testbeanCreateByArgs");
TestBean bean2 = (TestBean) context.getBeanObject("staticTestbeanCreateByArgs");
TestBean bean3 = (TestBean) context.getBeanObject("staticTestbeanCreateNoArgs");
}

@Test
public void runExceptionCase()
{
try {
TestBean bean = (TestBean) context
.getBeanObject("testbeanCreateNoArgsThrowException");
} catch (Exception e) {
e.printStackTrace();
}
try {
TestBean bean1 = (TestBean) context
.getBeanObject("testbeanCreateByArgsThrowException");
} catch (Exception e) {
e.printStackTrace();
}
try {
TestBean bean2 = (TestBean) context
.getBeanObject("staticTestbeanCreateByArgsThrowException");
} catch (Exception e) {
e.printStackTrace();
}
try {
TestBean bean3 = (TestBean) context
.getBeanObject("staticTestbeanCreateNoArgsThrowException");
} catch (Exception e) {
e.printStackTrace();
}
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值