bbossgroups 3.5 发布

简介: 版本:bbossgroups-3.5 官网:http://www.bbossgroups.com 项目博客:http://yin-bp.iteye.com/ Sourceforge站点:http://sourceforge.
版本: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

----------------------------------------------------------------------
本次版本的主要改进:
1.本版本及后续版本的源码托管到 github
2.aop/ioc支持循环依赖注入功能,支持类似于C指针引用方式的对象属性引用及任何对象内部局部属性的引用,引用层级不受限制,bboss aop框架逐步成为能够做到该功能的少数几个框架之一。
3.序列化机制支持复杂对象及对象之间关系(单向引用,双向引用,树结构,网状结构)序列化和恢复功能,
    使得bboss序列化工具成为少数几个能够实现完全序列化功能的工具之一。
4.全面改进bbossgroups系列组件中使用的java反射机制,支持asm 4.0,全面改进性能和易用性:
   aop框架管理的业务对象、mvc控制器方法参数对象、标签展示对象、持久层or mapping对象中属性不再需要定义get/set方法即可完成值得注入和展示、绑定等功能

5.sourceforge 发布文件增加文件 distrib.zip文件,包含所有框架发布的jars文件目录和框架完整的可运行的web应用bboss.war

更多的信息如下: 
   
一.bboss aop框架更新
o 修复IOC机制中三层及三层以上循环依赖注入引用关系无法正常解析的漏洞
o 为了和避免和官方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包中。

o 改进ioc依赖注入机制,支持循环依赖注入功能(之前得版本不支持循环依赖注入),并且支持任何层面的对象引用,引用的定义为:

refid格式:                                                                                      含义
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对应的构造函数参数(容器服务组件为构造函数注入)

其中属性的引用是不限制层级的

o 统一将rpc协议序列化机制切换到bboss的序列化机制
已经完成切换的协议:
http,webservice,netty,rmi,mina,jms
未完成的协议(暂不做改进):
jgroups
因此采用jgroups协议时,所有的参数数据都要实现序列化接口,其他协议则不需要
o 改进http协议和webservice rpc协议性能,改进反射机制
o ioc属性注入中相应的属性不再需要set方法
o 引进最新的bboss soa序列化机制,对于static,final,transient类型的属性不进行序列化,对于添加了@ExcludeField的注解不序列化
需要序列化的字段不再需要get/set方法

---------------------------------------------------------------------
二.bboss mvc更新
------2012-2-7------------
o 集合类型(List,Map),如果没有数据记录,则直接返回,修复没有数据情况下返回一条空记录的问题
------2011-12-11------------
o 更新最新的bboss aop框架,控制器需要注入的业务组件不再需要set方法
o 改进以下注解,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------------
o 改进jason转换器,避免和文件下载转换器的冲突

----------------------------------------------------------------------
三.bboss persistent更新
o 解决连接池中无法查找到tomcat 6和weblogic 容器数据源的问题
o 解决sql server jtd驱动无法正确找到DB adaptor的问题
o PreparedDBUtil增加public void setBlob(int i, String x) throws SQLException 方法,用来直接向blob类型字段中存入字符串
o 修改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;
}
o 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);

}
o 修复执行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);
o 优化or mapping性能
o 更新最新的frameworkset-util.jar,持久层or mapping机制的bean的属性不再需要get/set方法
o 将动态添加的数据源的removeAbandoned属性设置为false

---------------------------------------------------------------

四.bboss taglib更新
------2011-12-11------------
o 更新最新的frameworkset-util.jar,cell标签读取的bean的属性不再需要get方法
------2011-11-20------------
o 调整jquery-1.4.2.min.js的load方法支持数组参数的传递
o 调整pager.js的loadPageContent方法支持数组参数的传递
o 分页参数传递支持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------------
o 增加params,beanparams标签
params:为分页列表标签中自动设置的超链接添加参数数组
beanparams:为分页列表标签中自动设置的超链接添加参数,参数来自java对象属性或者Map中键值对
bean属性可以指定com.frameworkset.common.tag.pager.IgnoreParam注解,beanparams标签会忽略带有
IgnoreParam注解的属性

------2011-11-2------------
o 修改covert标签空指针异常

-----------------------------------------------------------------
五.bboss util更新

o ClassInfo对象增加isprimary方法,标识对应的类型是否是bboss定义的基础数据类型范畴
o 增加获取方法参数名称的工具类LocalVariableTableParameterNameDiscoverer
获取LocalVariableTableParameterNameDiscoverer的方法如下:
ParameterNameDiscoverer parameterNameDiscoverer = ClassUtil.getParameterNameDiscoverer();
获取方法参数名称的方法如下:
ParameterNameDiscoverer parameterNameDiscoverer = ClassUtil.getParameterNameDiscoverer();
Method method = ClassInfo.class.getMethod("getDeclaredMethod", String.class);
String[] names = parameterNameDiscoverer.getParameterNames(method);
o 内置asm 4.0版本

---------------------------------------------------------------
六.bboss 序列化更新
o 引进序列化机制,对于static,final,transient类型的属性不进行序列化,对于添加了@ExcludeField的注解不序列化
o 对象中序列化的字段不再需要get/set方法
o 支持复杂对象及对象之间关系序列化和恢复功能
相关实践学习
使用ACS算力快速搭建生成式会话应用
阿里云容器计算服务 ACS(Container Compute Service)以Kubernetes为使用界面,采用Serverless形态提供弹性的算力资源,使您轻松高效运行容器应用。本文将指导您如何通过ACS控制台及ACS集群证书在ACS集群中快速部署并公开一个容器化生成式AI会话应用,并监控应用的运行情况。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
机器学习/深度学习 算法 算法框架/工具
Tensorflow源码解析1 -- 内核架构和源码结构
# 1 主流深度学习框架对比 当今的软件开发基本都是分层化和模块化的,应用层开发会基于框架层。比如开发Linux Driver会基于Linux kernel,开发Android app会基于Android Framework。深度学习也不例外,框架层为上层模型开发提供了强大的多语言接口、稳定的运行时、高效的算子,以及完备的通信层和设备层管理层。因此,各大公司早早的就开始了深度学习框架的研
6626 0
|
9月前
|
存储 机器学习/深度学习 人工智能
AllData数据中台核心菜单十二:数据同步平台
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。
AllData数据中台核心菜单十二:数据同步平台
|
缓存 NoSQL Java
瑞吉外卖项目笔记+踩坑2——缓存、读写分离优化
缓存菜品、套餐数据、mysql主从复制实现读写分离、前后端分离
瑞吉外卖项目笔记+踩坑2——缓存、读写分离优化
|
弹性计算 网络协议 Linux
云服务器评估迁移时间与测试传输速度
云服务器评估迁移时间与测试传输速度
|
缓存 算法 Linux
深入理解操作系统的内存管理机制
【6月更文挑战第23天】内存管理是操作系统中一个至关重要的功能,它直接影响到系统性能和资源利用效率。本文旨在深入探讨现代操作系统中内存管理的核心概念、关键技术以及面临的挑战。通过分析内存管理的基本原理、内存分配策略、虚拟内存技术、缓存管理和内存安全等方面,揭示内存管理在提升操作系统稳定性、安全性与高效性方面的作用。文章将结合具体操作系统实例,如Windows、Linux等,阐述不同内存管理技术的实现细节和优化策略,为读者提供对操作系统内存管理机制全面而深刻的认识。
396 3
|
Java
OpenFeign 各种用法、 logger 日志记录
OpenFeign 各种用法、 logger 日志记录
227 0
|
前端开发
ant design tabCard封装
ant design tabCard封装
142 0
|
存储 C语言
【C语言数组】创建、初始化、以及使用1
【C语言数组】创建、初始化、以及使用
173 4
|
机器学习/深度学习 算法 定位技术
其它GIS相关数据下载网站整理
其它GIS相关数据下载网站整理
113 1
|
消息中间件 运维 Cloud Native
饿了么资深架构师分享云上基础架构演进
从单体应用到微服务体系再到多活架构,从用云到IaaS全面上云再PaaS上云,最后全面拥抱云原生,这就是饿了么的云上基础架构演进之路。
饿了么资深架构师分享云上基础架构演进