版本:bbossgroups-3.5
官网:
http://www.bbossgroups.com
项目博客:
http://yin-bp.iteye.com/
Sourceforge站点:
http://sourceforge.net/projects/bboss/files/
Github站点:
https://github.com/bbossgroups/bbossgroups-3.5
-----------------------------------------------------------------------------------------------
本次版本的主要改进:
- 本版本及后续版本的源码托管到 github
- 改进ioc机制,支持循环依赖注入功能,支持类似于C指针引用方式的对象属性引用及任何对象内部局部属性的引用,引用层级不受限制,bboss aop框架逐步成为能够做到该功能的少数几个框架之一。
- 序列化机制支持复杂对象及对象之间关系(单向引用,双向引用,树结构,网状结构)序列化和恢复功能,使得bboss序列化工具成为少数几个能够实现完全序列化功能的工具之一。
- 全面改进bbossgroups系列组件中使用的java反射机制,支持asm 4.0,全面改进性能和易用性:aop框架管理的业务对象、mvc控制器方法参数对象、标签展示对象、持久层or mapping对象中属性不再需要定义get/set方法即可完成值得注入和展示、绑定等功能
- sourceforge 发布文件增加文件distrib.zip文件,包含所有框架发布的jars文件目录和框架完整的可运行的web应用bboss.war
更多的信息如下:
一、bboss aop框架更新
● 为了和避免和官方jgroups包冲突,将bboss中的jgroups包路径全部由org.jgroups改为bboss.org.jgroups;jg-magic-map.xml文件名称改为bboss-magic-map.xml;jg-protocol-ids.xml文件名称改为bboss-protocol-ids.xml。
为了避免不必要的麻烦,jgroups.jar包名称暂时没有改,如果存在包名称冲突用户可根据实际情况进行修改名称(一般不需要修改)。
系统管理平台、应用支持平台、数据交换平台、请求服务平台等系统升级框架到3.5时需要注意,升级完毕后需要修改src-sys/com/chinacreator/remote/Utils.java文件中的以下引用路径:
import org.jgroups.Channel;
import org.jgroups.util.RspList;
为:
import bboss.org.jgroups.Channel;
import bboss.org.jgroups.util.RspList;
修改完毕后,将编译好的类文件更新到相应系统的system.jar包中。
● 改进ioc依赖注入机制,支持循环依赖注入功能(之前得版本不支持循环依赖注入),并且支持任何层面的对象引用,引用的定义如下。
1.attr:serviceid:根据服务标识引用容器服务组件
2.attr:serviceid[0]:根据服务标识及数组下标引用容器服务组件对应的下标为0对应的元素(容器服务组件类型为list,set,array三种类型)
3.attr:serviceid[key]:根据服务标识及map key引用容器服务组件对应的索引为key对应的元素(容器服务组件类型为map类型)
4.attr:serviceid{0}:根据服务标识及构造函数参数位置下标引用容器服务组件对应的下标为0对应的构造函数参数(容器服务组件为构造函数注入)
5.attr:serviceid->innerattributename :根据服务标识及服务组件的属性名称引用容器服务组件属性值
6.attr:serviceid->innerattributename[0]:根据服务标识及服务属性名称以及属性数组下标引用容器服务组件属性中对应的下标为0对应的元素(容器服务组件类型为list,set,array三种类型)
7.attr:serviceid->innerattributename[key]:根据服务标识及服务属性名称以及map key引用容器服务组件属性对应的索引为key对应的元素(容器服务组件类型为map类型)
8.attr:serviceid->innerattributename{0}:根据服务标识及服务属性名称对应属性的造函数参数位置下标引用容器服务组件对应的下标为0对应的构造函数参数(容器服务组件为构造函数注入)
其中属性的引用是不限制层级的
● 统一将rpc协议序列化机制切换到bboss的序列化机制。已经完成切换的协议:http,webservice,netty,rmi,mina,jms;未完成的协议(暂不做改进):jgroups
因此采用jgroups协议时,所有的参数数据都要实现序列化接口,其他协议则不需要
● 改进http协议和webservice rpc协议性能,改进反射机制
● ioc属性注入中相应的属性不再需要set方法
● 引进最新的bboss soa序列化机制,对于static,final,transient类型的属性不进行序列化,对于添加了@ExcludeField的注解不序列化
需要序列化的字段不再需要get/set方法
---------------------------------------------------------------------
二、bboss mvc更新
------2012-2-7------------
● 集合类型(List,Map),如果没有数据记录,则直接返回,修复没有数据情况下返回一条空记录的问题
------2011-12-11------------
● 更新最新的bboss aop框架,控制器需要注入的业务组件不再需要set方法
● 改进以下注解,name或者value属性不再是必须选项,如果没有指定name属性,则使用方法参数名称作为name属性的值:RequestParam、PathVariable、CookieValue、RequestHeader、Attribute
为了确保能够正确获取到mvc控制器方法的参数名称,必须在编译java代码时保证在class文件中生成java本地变量表。eclipse工具默认会生成,ant编译工具也会生成。
同时除了PathVariable注解,以下注解不在是控制器方法参数的必须注解,如果没有指定,基础类型参数将直接用方法名称从request中获取相关属性的值:RequestParam、PathVariable、RequestHeader、Attribute、CookieValue
bboss中界定的基础数据类型如下:String.class,int.class ,Integer.class,long.class,Long.class,java.sql.Timestamp.class,java.sql.Date.class,java.util.Date.class,boolean.class ,Boolean.class,BigFile.class,float.class ,Float.class,short.class ,Short.class,double.class,Double.class,char.class ,Character.class,byte.class ,Byte.class,BigDecimal.class
------2011-11-2------------
● 改进jason转换器,避免和文件下载转换器的冲突
----------------------------------------------------------------------
三、bboss persistent更新
● 解决连接池中无法查找到tomcat 6和weblogic 容器数据源的问题
● 解决sql server jtd驱动无法正确找到DB adaptor的问题
● PreparedDBUtil增加public void setBlob(int i, String x) throws SQLException 方法,用来直接向blob类型字段中存入字符串
修改TestLob测试用例,用来演示SQLExecutor/ConfigSQLExecutor组件向Blob和clob中插入字符串的方法:
@Test
public void testNewSQLParamInsert() throws Exception
{
SQLParams params = new SQLParams();
params.addSQLParam("id", "1", SQLParams.STRING);
// ID,HOST_ID,PLUGIN_ID,CATEGORY_ID,NAME,DESCRIPTION,DATASOURCE_NAME,DRIVER,JDBC_URL,USERNAME,PASSWORD,VALIDATION_QUERY
params.addSQLParam("blobname", "abcdblob",
SQLParams.BLOB);
params.addSQLParam("clobname", "abcdclob",
SQLParams.CLOB);
SQLExecutor.insertBean("insert into test(id,blobname,clobname) values(#[id],#[blobname],#[clobname])", params);
}
@Test
public void testNewBeanInsert() throws Exception
{
LobBean bean = new LobBean();
bean.id = "2";
bean.blobname = "abcdblob";
bean.clobname = "abcdclob";
SQLExecutor.insertBean("insert into test(id,blobname,clobname) values(#[id],#[blobname],#[clobname])", bean);
}
注意如果
public static class LobBean
{
private String id;
@Column(type="blob")//blob会通知持久层框架将属性blobname的值作为数据库blob字段类型进行存储
private String blobname;
@Column(type="clob")")//clob会通知持久层框架将属性blobname的值作为数据库clob字段类型进行存储
private String clobname;
}
中type分别为blobfile或者clobfile时,就必须要求字段的值类型为以下三种:
1.java.io.File
2.MultipartFile
3.InputStream
例如:
public static class LobBean
{
private String id;
@Column(type="blobfile")
private File blobname;
@Column(type="clobfile")
private File clobname;
}
● SQLExecutor/ConfigSQLExecutor组件增加单字段多记录结果类型为List<String>的查询功能,使用方法如下:
@Test
public void dynamicquery() throws SQLException
{
List<ListBean> result = SQLExecutor.queryList(ListBean.class,"select id from LISTBEAN");
System.out.println(result.size());
List<String> result_string = SQLExecutor.queryList(String.class,"select id from LISTBEAN");
System.out.println(result_string.size());
List<Integer> result_int = SQLExecutor.queryList(Integer.class,"select id from LISTBEAN");
System.out.println(result_int.size());
}
@Test
public void dynamicqueryObject() throws SQLException
{
ListBean result = SQLExecutor.queryObject(ListBean.class,"select id from LISTBEAN");
System.out.println(result.getId());
String result_string = SQLExecutor.queryObject(String.class,"select id from LISTBEAN");
System.out.println(result_string);
int result_int = SQLExecutor.queryObject(int.class,"select id from LISTBEAN");
System.out.println(result_int);
}
● 修复执行clob 文件插入操作导致空指针的问题
sql = "INSERT INTO CLOBFILE (FILENAME,FILECONTENT,fileid,FILESIZE) VALUES(#[filename],#[FILECONTENT],#[FILEID],#[FILESIZE])";
SQLParams sqlparams = new SQLParams();
sqlparams.addSQLParam("filename", file.getOriginalFilename(), SQLParams.STRING);
sqlparams.addSQLParam("FILECONTENT", file,SQLParams.CLOBFILE);
sqlparams.addSQLParam("FILEID", UUID.randomUUID().toString(),SQLParams.STRING);
sqlparams.addSQLParam("FILESIZE", file.getSize(),SQLParams.LONG);
SQLExecutor.insertBean(sql, sqlparams);
● 优化or mapping性能
● 更新最新的frameworkset-util.jar,持久层or mapping机制的bean的属性不再需要get/set方法
● 将动态添加的数据源的removeAbandoned属性设置为false
---------------------------------------------------------------
四、bboss taglib更新
------2011-12-11------------
● 更新最新的frameworkset-util.jar,cell标签读取的bean的属性不再需要get方法
------2011-11-20------------
● 调整jquery-1.4.2.min.js的load方法支持数组参数的传递
● 调整pager.js的loadPageContent方法支持数组参数的传递
● 分页参数传递支持map、bean中包含数据参数传递,支持数组参数传递,通过以下标签实现:
params标签:<pg:params name="userName" />
beanparams标签:<pg:beanparams name="user"/>
如果要使用这两个标签,需要更新以下程序:
/WEB-INF/lib/frameworkset.jar
/include/jquery-1.4.2.min.js
/include/pager.js
同时需要检查pager-taglib.tld中是否定义了一下params标签和beanparams标签:
<!--
功能说明:为分页列表标签中自动设置的超链接添加参数数组
-->
<tag>
<name>params</name>
<tagclass>com.frameworkset.common.tag.pager.tags.ParamsTag</tagclass>
<bodycontent>empty</bodycontent>
<attribute>
<name>id</name>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>name</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>encode</name>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<!--
功能说明:为分页列表标签中自动设置的超链接添加参数,参数来自java对象属性或者Map中键值对
-->
<tag>
<name>beanparams</name>
<tagclass>com.frameworkset.common.tag.pager.tags.BeanParamsTag</tagclass>
<bodycontent>empty</bodycontent>
<attribute>
<name>id</name>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>name</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>encode</name>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
------2011-11-18------------
增加params、beanparams标签。
params:为分页列表标签中自动设置的超链接添加参数数组
beanparams:为分页列表标签中自动设置的超链接添加参数,参数来自java对象属性或者Map中键值对
bean属性可以指定com.frameworkset.common.tag.pager.IgnoreParam注解,beanparams标签会忽略带有IgnoreParam注解的属性
------2011-11-2------------
● 修改covert标签空指针异常
-----------------------------------------------------------------
五、bboss util更新
● ClassInfo对象增加isprimary方法,标识对应的类型是否是bboss定义的基础数据类型范畴
● 增加获取方法参数名称的工具类LocalVariableTableParameterNameDiscoverer
● 获取LocalVariableTableParameterNameDiscoverer的方法如下:
ParameterNameDiscoverer parameterNameDiscoverer = ClassUtil.getParameterNameDiscoverer();
获取方法参数名称的方法如下:
ParameterNameDiscoverer parameterNameDiscoverer = ClassUtil.getParameterNameDiscoverer();
Method method = ClassInfo.class.getMethod("getDeclaredMethod", String.class);
String[] names = parameterNameDiscoverer.getParameterNames(method);
● 内置asm 4.0版本
---------------------------------------------------------------
六、bboss 序列化更新
● 引进序列化机制,对于static,final,transient类型的属性不进行序列化,对于添加了@ExcludeField的注解不序列化
● 对象中序列化的字段不再需要get/set方法
● 支持复杂对象及对象之间关系序列化和恢复功能
28 楼 caoyangx 2012-02-16 09:03
nutz、bboss、douyu、jxva、guzz...都是非常不错的框架,只要不收费且可持续发展,大家还有什么好喷的。
收费也骂,免费也骂,做得好也骂,做的差更骂。都是羡慕嫉妒恨,引用郭德纲的一句话,只有同行才是赤裸裸的恨。
27 楼 yin_bp 2012-02-15 20:06
..........
在如今Spring如日中天的时候,bbossgroups难发展啊。
还是会下载来用用看。
我们搞bboss并不是要赚钱,我们都有自己的全职工作,完全是出于对开源的爱好,也很高兴把bboss拿出来和大家交流分享,感谢大家的支持。当然我们也希望bboss能够发展壮大起来,能够为国内的开源奉献一点力量,但是我们不会因为bboss发展不起来而不搞bboss了,呵呵,相反我们会一如既往,我们会尽力将bboss做得更好更完善。
26 楼 SMCwwh 2012-02-15 10:58
bboss和spring主要区别如下:
1.bboss是轻量级的综合性j2ee框架,而spring是重量级的功能更多
2.bboss aop可以通过其xml语法描述复杂的对象数据及数据结构,而不仅仅是做为ioc组件管理的语法,并且可以非常方便地实现对象和xml之间的转换
3.bboss ioc容器既是组件管理容器也是远程服务注册中心,可以非常方便地对容器中的组件发起远程服务调用,并提供可插拔的认证和鉴权机制
4.bboss标签库非常丰富,包括分页,树等类型。持久层接口简洁易用
5.bboss mvc的控制器方法能非常方便地实现list,map,数组等容器类型参数绑定,方便地实现多文件上传和附件下载。
6.bboss持久层能方便地实现大字段的和文件的存储和获取
暂时这么多,更多信息请参考博客文章
在如今Spring如日中天的时候,bbossgroups难发展啊。
还是会下载来用用看。
25 楼 yin_bp 2012-02-15 07:43
bboss和spring主要区别如下:
1.bboss是轻量级的综合性j2ee框架,而spring是重量级的功能更多
2.bboss aop可以通过其xml语法描述复杂的对象数据及数据结构,而不仅仅是做为ioc组件管理的语法,并且可以非常方便地实现对象和xml之间的转换
3.bboss ioc容器既是组件管理容器也是远程服务注册中心,可以非常方便地对容器中的组件发起远程服务调用,并提供可插拔的认证和鉴权机制
4.bboss标签库非常丰富,包括分页,树等类型。持久层接口简洁易用
5.bboss mvc的控制器方法能非常方便地实现list,map,数组等容器类型参数绑定,方便地实现多文件上传和附件下载。
6.bboss持久层能方便地实现大字段的和文件的存储和获取
暂时这么多,更多信息请参考博客文章
24 楼 yin_bp 2012-02-14 09:38
如题
23 楼 madbluesky 2012-02-14 09:36
22 楼 zhangzi 2012-02-14 08:00
21 楼 yin_bp 2012-02-13 21:13
《bbossgroups持久层框架动态sql语句配置和使用》
bboss 动态sql使用foreach循环示例
20 楼 yin_bp 2012-02-13 21:01
很高兴能和你交流,最近比较忙,好不容易抽时间发了这个新闻,下班回来一看发现还很热闹,难得啊。
bbossgroups框架体系是我在工作之余开发的一套框架体系,框架中的某些模块确实参考并引用了spring的部分代码,由此引起部分人的不安,我深感抱歉。
看你的介绍,风格确实有点类似,首先bboss mvc的restful代码风格如下:
持久层bboss支持sql配置文件的dao也支持直接操作sql的dao方式,你所对比的方式只是操作sql的dao方式。sql配置的模式,支持sql语句热加载(在线配置修改无需重启服务器),配置语法直接使用bboss aop配置语法,基于sql配置方式的dao用法如下:
上面只是例举了一些使用方法,更详细的信息可以浏览bboss官方博客中关于持久层和mvc的部分文章以及[urlhttps://github.com/bbossgroups/bbossgroups-3.5/]在线源码库[/url]
19 楼 yin_bp 2012-02-13 19:12
伙计你错了bboss并不只是包含mvc,它还包含了ioc,rpc,webservice服务管理和调用,定时任务,持久层,标签库,mq集成,序列化等很多深受我们开发人员喜欢的功能
18 楼 bao231 2012-02-13 18:49
17 楼 yin_bp 2012-02-13 18:45
你也发现了?很多类是直接照搬的。
bboss mvc中确实引入了部分spring mvc的代码,这个是事实,我想大家没必要在这个上纠结
16 楼 george_space 2012-02-13 17:02
控制器部分代码》》
@Get("{doType}/{planId}")
public Result show(@Param("doType") String doType, @Param("planId") Integer planId) {
。。。。。
这位兄弟的代码太长没怎么看懂,也不清楚你的代码的优势,不过可以说一下bboss mvc控制器方法参数是不需要加注解的,是自动和request参数名称映射的,另外dao层组件使用更加简洁。
bboss 和 spring是两个不同的框架,不过spring是bboss的老师
我的控制器方法也可以不加注解,而且通常是不加注解的,比如:
对应的RESTful 式 URI是:
http://{your-host}/test/user/show
优先解析约定规则,当使用注解进行配置后,才使用注解配置的规则。
====================================================
下面是你的DAO部分:
下面是我的DAO部分:
从代码对比来看,你的DAO并不简洁啊,而且最关键的是,你的DAO部分,把SQL语句直接写在Java代码中了,这是一个非常不好的设计,强烈建议楼主改进这部分,我相信你改进完之后应该和我的DAO差不多了。
下面是我的DAO实现数据插入:
===========================================================
体外话:Iteye的UBB编辑器最近很不好用,引用和code标签最近经常出问题,可能和我最近网速不稳定有关系吧。
转正题:鼓励楼主的开源精神,楼主的 SQLParams 类都和我的 SqlParam 类命名类似,看来真是有缘。
15 楼 george_space 2012-02-13 16:54
控制器部分代码》》
@Get("{doType}/{planId}")
public Result show(@Param("doType") String doType, @Param("planId") Integer planId) {
。。。。。
这位兄弟的代码太长没怎么看懂,也不清楚你的代码的优势,不过可以说一下bboss mvc控制器方法参数是不需要加注解的,是自动和request参数名称映射的,另外dao层组件使用更加简洁。
bboss 和 spring是两个不同的框架,不过spring是bboss的老师
SQLParams params = new SQLParams();
params.addSQLParam("id", "1", SQLParams.STRING);
// ID,HOST_ID,PLUGIN_ID,CATEGORY_ID,NAME,DESCRIPTION,DATASOURCE_NAME,DRIVER,JDBC_URL,USERNAME,PASSWORD,VALIDATION_QUERY
params.addSQLParam("blobname", "abcdblob",
SQLParams.BLOB);
params.addSQLParam("clobname", "abcdclob",
SQLParams.CLOB);
SQLExecutor.insertBean("insert into test(id,blobname,clobname) values(#[id],#[blobname],#[clobname])", params);
控制器部分代码》》
@Get("{doType}/{planId}")
public Result show(@Param("doType") String doType, @Param("planId") Integer planId) {
。。。。。
这位兄弟的代码太长没怎么看懂,也不清楚你的代码的优势,不过可以说一下bboss mvc控制器方法参数是不需要加注解的,是自动和request参数名称映射的,另外dao层组件使用更加简洁。
bboss 和 spring是两个不同的框架,不过spring是bboss的老师
我的控制器方法也可以不加注解,而且通常是不加注解的,比如:
对应的RESTful 式 URI是:
http://{your-host}/test/user/show
优先解析约定规则,当使用注解进行配置后,才使用注解配置的规则。
====================================================
下面是你的DAO部分:
下面是我的DAO部分:
从代码对比来看,你的DAO并不简洁啊,而且最关键的是,你的DAO部分,把SQL语句直接写在Java代码中了,这是一个非常不好的设计,强烈建议楼主改进这部分,我相信你改进完之后应该和我的DAO差不多了。
下面是我的DAO实现数据插入:
14 楼 george_space 2012-02-13 16:42
控制器部分代码》》
@Get("{doType}/{planId}")
public Result show(@Param("doType") String doType, @Param("planId") Integer planId) {
。。。。。
这位兄弟的代码太长没怎么看懂,也不清楚你的代码的优势,不过可以说一下bboss mvc控制器方法参数是不需要加注解的,是自动和request参数名称映射的,另外dao层组件使用更加简洁。
bboss 和 spring是两个不同的框架,不过spring是bboss的老师
我的控制器方法也可以不加注解,而且通常是不加注解的,比如:
对应的RESTful 式 URI是:
http://{your-host}/test/user/show
优先解析约定规则,当使用注解进行配置后,才使用注解配置的规则。
13 楼 hlylove 2012-02-13 16:28
你也发现了?很多类是直接照搬的。
12 楼 fainfy 2012-02-13 16:21
11 楼 qiu768 2012-02-13 16:16
10 楼 pch272215690 2012-02-13 15:52
不是中国人写不出好的框架,国情不一样。好不容易有人尝试做开源,还得被喷子扼杀。
9 楼 chenkaiyu 2012-02-13 15:47
控制器部分代码》》
@Get("{doType}/{planId}")
public Result show(@Param("doType") String doType, @Param("planId") Integer planId) {
。。。。。
这位兄弟的代码太长没怎么看懂,也不清楚你的代码的优势,不过可以说一下bboss mvc控制器方法参数是不需要加注解的,是自动和request参数名称映射的,另外dao层组件使用更加简洁。
bboss 和 spring是两个不同的框架,不过spring是bboss的老师