`

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

阅读更多
1.bboss aop框架的工厂模式实现组件管理概述

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的实例。

下面介绍具体的程序和配置
2.配置文件中如何配置工厂模式
<!-- 
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
3.需要创建的组件
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;
	}
}



4.管理组件的工厂
静态工厂

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



5.工厂类实例方法模式
以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客户端代理实例)。
6.测试用例
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
3
分享到:
评论
7 楼 yin_bp 2011-09-06  
binsoft 写道
说句心里话,我觉得LZ应该从底层的实现开始写一份完整的文档,包括DEMO以及用法,还有代码中的注释也应该多完善一下,还有一些依赖的JS文件感觉有点乱;希望你能够坚持下去,不要放弃。

一直在努力,一直在坚持,谢谢大家的建议和支持,bbossgroup会持续改进的,文档也会不断完善的,框架本身依赖的js不多,主要是demo里面有些效果需要用到一些js,也没空整理,框架依赖的资源可以参考文档《bbossgroups框架发布的jar包和依赖jar包概览
》:
http://yin-bp.iteye.com/blog/1143994
6 楼 binsoft 2011-09-06  
说句心里话,我觉得LZ应该从底层的实现开始写一份完整的文档,包括DEMO以及用法,还有代码中的注释也应该多完善一下,还有一些依赖的JS文件感觉有点乱;希望你能够坚持下去,不要放弃。
5 楼 yin_bp 2011-04-30  
框架整个发展过程始终和实际项目结合在一起,框架构建的指导思想:
在项目中提炼框架、在项目中完善框架、与项目相互促进形成良性互动。
为了正确引导开发人员使用框架,编写框架组件api文档、测试用例和使用demo。
4 楼 yin_bp 2011-04-30  
呵呵,谢谢大家建议,也很希望有兴趣的朋友能够参与到bboss项目的建设中来,集思广益,使得该项目确确实实能够为大家所用,为大家所接纳,也算是国人为国人做点还算得上主流的开发框架,呵呵,再次感谢大家,也再次欢迎大家加入bboss项目的开发团队(不好意思,到现在为止,团队成员只有我一个人,编码,文档,测试,版本维护,呵呵,而且全部是业余时间在搞)
3 楼 loveyeah 2011-04-30  
lqixv 写道
我看了你博客上的文章,感觉你很厉害!

有点想用你的框架来试试,只是以前用过一些国内开发的框架,一般都是过一段时间后,就不再开发了,还有就是里面有bug的,或自己框架的缺陷从来不说。搞得花费了大量的时间和精力后,却不了了之,实在让人伤心。

说上面的话,不是贬低国内人员开发的框架,只是希望你不要象他们那样。一定要坚持下去。


国人的开源,只要坚持,还是可以做的很好的,我一直在关注bboss,他的作者,非常不错,持续下去,这种精神就是开源,我们要支持。
我也看到过很多国人的开源,后来不了了之,这和整个环境有关,因为更多对开源只是索取,还有很多人持着不信任,或无端的挑剔。但还是有很多优秀的开源,不断充实着我们的开源世界。从我们自身开始,肯定和鼓励我们开源作者的努力,他们无私的奉献。我相信国人的开源“明天更美好”。

支持你yin_bp,有个小建议,是否可以考虑让更多人参与到你的项目中,找一些志同道合的人,集众人之智慧,持续发展!

个人愚见。

2 楼 yin_bp 2011-04-27  
作为一个开源爱好者,我不能给出什么承诺,呵呵,我只能说尽量将bbossgroups框架做的更完善、更好用,呵呵,而且作为一种兴趣爱好,我会投入尽可能多的时间和精力去完善这套框架,尽力保证他的简洁和灵活性的前提下,提供更多更好的功能
1 楼 lqixv 2011-04-27  
我看了你博客上的文章,感觉你很厉害!

有点想用你的框架来试试,只是以前用过一些国内开发的框架,一般都是过一段时间后,就不再开发了,还有就是里面有bug的,或自己框架的缺陷从来不说。搞得花费了大量的时间和精力后,却不了了之,实在让人伤心。

说上面的话,不是贬低国内人员开发的框架,只是希望你不要象他们那样。一定要坚持下去。

相关推荐

    bboss ioc配置文件中使用外部属性文件介绍

    在Java开发中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它能提高代码的可测试性和可维护性。BBoss是一个轻量级的企业级应用开发框架,提供了IOC(Inversion of Control)功能,使得对象之间...

    bboss会话共享培训文档

    bboss会话共享采用MongoDB作为存储后端,使用增量模式修改会话属性,提供高效的数据存储和访问。数据的序列化采用XML格式,目的是为了良好的可读性,并且易于监控。bboss兼容Servlet 2/3规范,能够与现有的应用系统...

    bboss+es基本操作示例.zip

    集成bboss和Elasticsearch时,首先需要在项目中引入bboss的依赖,并配置Elasticsearch的相关连接信息,如集群名称、节点地址等。然后可以通过bboss提供的API进行索引创建、数据插入、查询、更新、删除等操作。 4. ...

    bboss mvcdemo 下载地址

    BBoss MVCDemo 是一个基于Java的企业级应用框架,它主要为开发者提供了一种高效、灵活的MVC(Model-View-Controller)开发模式。这个框架的目的是简化企业级Web应用的开发流程,提高开发效率,并且具备良好的可扩展...

    企业级J2EE开源框架bboss

    1. **组件化开发**:BBoss支持模块化和组件化的开发模式,允许开发者根据项目需求选择必要的功能组件,避免了传统框架中“大而全”的问题,降低了系统的复杂度。 2. **数据库操作**:BBoss提供了便捷的数据访问层...

    springboot整合bboss es增删改查测试demo代码

    本实例是一个基于bboss es spring boot starter的demo maven工程,可供spring boot项目集成bboss elasticsearch rest client参考 展示了通过spring boot管理单集群功能和管理多集群功能 单集群测试用例:...

    bboss-elasticsearch开发环境搭建和开发入门视频教程.

    2. **bboss elasticsearch开发入门教程.wmv**: 通过实例演示,讲解如何使用BBoss进行索引操作、数据插入、查询和更新,帮助初学者快速上手。 **六、资料阅读** "说明.txt" 文件可能包含了关于这些教程的详细步骤和...

    bboss会话共享培训文档分享

    本培训文档将介绍集群session管理的发展历史、bbosssession的架构及特点、性能指标、与应用的集成方式、部署模式以及场景演示等,旨在帮助技术人员理解并掌握bbosssession的使用方法和优势。 一、集群session管理...

    springboot集成ElasticsearchBboss调用Elasticsearch.md

    springboot集成ElasticsearchBboss调用Elasticsearch的案例分享

    bboss 安全认证过滤器功能介绍

    3. **销毁清理**:当应用关闭或过滤器不再使用时,`destroy()`方法会被调用,用于清理资源。 在BBoss框架中,安全认证通常涉及以下步骤: 1. **用户登录**:用户通过提交用户名和密码发起登录请求,服务器验证这些...

    由 bboss 开源的数据采集&流批一体化工具,提供数据采集、数据清洗转换处理和数据入库以及数据指标统计计算流批一体化处理功能

    **bboss-datatran** 是一个由 **bboss** 社区开源的高效数据处理工具,专注于数据采集、数据清洗转换以及数据入库等任务。...通过深入学习和使用bboss-datatran,用户可以提升数据处理效率,更好地挖掘数据的价值。

    基于bboss新版平台项目环境搭建和代码工具使用视频教程.rar

    "基于bboss新版平台项目环境搭建和代码工具使用视频教程"提供了一套详细的指导,旨在帮助开发者快速掌握bboss新版本平台的相关操作。bboss,全称为Business Basic Open Source,是一个开源的企业级开发框架,它为...

    bboss elasticsearch-5.7.8.rar

    3. `bboss-util-5.5.0.jar`和`bboss-persistent-5.5.0.jar`:这是BBoss框架的核心组件,提供了许多实用工具类和持久化操作支持,如数据库连接、事务管理等,为Elasticsearch的数据导入提供底层支持。 4. `...

    bboss-db-elasticsearch-tool-master_java_

    【bboss-db-elasticsearch-tool-master_java_】是一个Java ORM(对象关系映射)框架,它在功能上超越了MyBatis,提供了对多种数据库的广泛支持,包括MySQL、Oracle、PostgreSQL、SQLServer、DB2、DM以及MongoDB。...

    bboss-elastic-tran:bboss 数据同步工具

    弹性Tran老板数据交换模块使用文档: : Bboss是一个很好的Elasticsearch Java Rest客户端。 它运行并访问像mybatis这样的elasticsearch来关联数据库。环境要求JDK要求:JDK 1.7+ Elasticsearch版本要求:1.X,2.X,5...

    bboss-soa.jar

    官方版本,亲测可用

    bboss persistent 1.0.2中方便地实现大字段(clob,blob)的处理

    通过学习相关文档和博客(如提供的链接),开发者可以快速上手并掌握其使用方法。 6. **性能优化**:BBoss Persistent还可能包括针对CLOB和BLOB的性能优化,比如预读取、延迟加载等策略,以提高应用的响应速度和...

    Elasticsearch rest client bboss介绍-Elastic2018中国开发者大会演讲稿.pptx

    Elasticsearch rest client bboss介绍-Elastic2018中国开发者大会演讲稿

Global site tag (gtag.js) - Google Analytics