博客搬家,本博客暂停更新
Spring 2.0 AOP 与事务配置突破
Spring 2.0 的重头戏之一就是AspectJ 式 AOP 配置。 但是一定要通过对比,才能看到2.0式的AOP配置是如何跳出一片新天空的。
1. 对比
先看1.0的标准事务配置:
<bean id="baseTxService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true"> <property name="transactionManager" ref="transactionManager"/> <property name="proxyTargetClass" value="true"/> <property name="transactionAttributes"> <props> <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="save*">PROPAGATION_REQUIRED</prop> <prop key="remove*">PROPAGATION_REQUIRED</prop> </props> </property> <property name="preInterceptors"> <list> <ref bean="methodSecurityInterceptor"/> </list> </property> </bean> <bean id="bookManager" parent="baseTxService"> <property name="target"> <bean class="org.springside.bookstore.admin.manager.BookManager"/> </property> </bean>
再看2.0的新配置:
<aop:config proxy-target-class="true"> <aop:advisor pointcut="execution(* *..*Manager.*(..))" advice-ref="txAdvice"/> <aop:advisor pointcut="execution(* *..*Manager.save(..))" advice-ref="fooAdvice"/> </aop:config><tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="save*"/> <tx:method name="remove*"/> <tx:method name="*" read-only="true"/> </tx:attributes> </tx:advice> <bean id="bookManager" class="org.springside.bookstore.commons.service.BookManager"/>
2.进步
1. AOP的配置方式也AOP了。
对比1.0的配置文件,因为下面2提到的限制,事关安全acegi methodSecurityInterceptor 拦截器要配置在关于事务的TransactionProxyFactoryBean的preInterceptors属性里,这样子就一点不AOP了。
而2.0使用ponintcut expression,很AOP的配置一切Aspect。
2. 1.0时,一个已经AOP过的object不能再次被AOP。
在Spring 1.0的文档里Rod说,比如<bean id="bookManager" parent="baseTxService">已经进行了一次AOP,如果想在这个Bean上再配一层AOP,比如要对方法执行结果缓存,无论以1.0 还是2.0的方式定义,cglib方式是会报错的,而基于接口的方式,结果不确定。
3. BookManager能直接定义自己,而不是像1.0那样作匿名内部target。
3. 语法
Spring参考文档 7.3 chema-based AOP support 提供了aspect,advisor,advide三种组装方法的解释,其中aspect是aspectJ原装,但稍复杂,
这里唯一有点难懂的是pointcut里的语法,其实也很好学,Spring参考文档7.2.3.4里有完整说明 ,其实一排子过去是
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)其中带问号的modifiers-pattern?(public/protected) 和 declaring-type-pattern? throws-pattern? 可以不填
可见execution(* *..BookManager.save(..))
- 第一颗* 代表ret-type-pattern 返回值可任意,
- *..BookManager 代表任意Pacakge里的BookManager类。
如果写成com.xyz.service.* 则代表com.xyz.service下的任意类
com.xyz.service..* com.xyz.service则代表com.xyz.service及其子package下的任意类 - save代表save方法,也可以写save* 代表saveBook()等方法
- (..) 匹配0个参数或者多个参数的,任意类型
(x,..) 第一个参数的类型必须是X
(x,,,s,..) 匹配至少4个参数,第一个参数必须是x类型,第二个和第三个参数可以任意,第四个必须是s类型。
The Elements of Ant Style
推荐 The Elements of Ant Style ,写Ant 脚本的best practice总结。
http://wiki.apache.org/ant/TheElementsOfAntStyle
有空要根据着来修改ss2的ant 脚本。 不过ant 脚本已花费太多时间了,短时间内不再动它。
幼学琼林--JDK5的三种内置Annotation
@Override 一方面提醒用户这是个重载函数,另一方面保证了父类作任何改动时,子类如果没有跟着变化,就会编译不过。虽然有点占地方,但用处的确很大,不会哪天子类被人卖了都不知道。
所以我甚至设置了让IDEA6检查所有重载函数必须加上@Override标识。
@SuppressWarnings("unchecked")
这个用法可以减少JDK5.0的集合操作引入范型后无处不在的warning。因为有些非JDK5.0的开源库如hibernate, 函数返回的一定是List,而不会是List<User>,这时候IDE就会爆出很多warning。用SuppressWarning可以取消掉它。
@Deprecated
以前写在JavaDoc里,现在单提了出来,注释已废弃的函数。用户使用该函数的话,编译时会得到提示,说你用了废柴API.
Spring 2.0发布了,SS2重新开始更新
折腾了快一年,又经过很臭美的倒数后,spring 2.0终于发布了。但对它的进度其实严重不满的,尤其看看它的jira里还有那么多没做完的事情。
SS2.0国庆期间更新如下:
1. 从项目中吸取的两个改进
一是构件库放弃单一的SSH Mainstream架构,而改为Struts/Strut2, Hibernate/Ibatis/Hibernate JPA可自由组合。 二是Helloworld里放弃了模块化架构,完全平面化适应小项目。
2. Struts的更新:
(详见wiki中的pramatic struts一节)
1. 改用lazyValidatorForm, 适合POJO的所有属性并不都在Form里的情况。 并升级到commons-beanutils-1.7.1 Snapshot 。
2. Struts-Config.xml 中使用通配符简化配置。
3. 开始编写CRUD的StrutsEntityAction。
3. Spring 2的更新:
配置文件改用2.0的DTD 文件,不是很喜欢用schema xsd文件,一大堆太长了。
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
还有好些小的bugfix......
Eclipse插件与新的QuickStart效果
在dfdfswsw的努力下,Simon同志的指导下,springside的第一个plugin终于诞生了。
第一个plugin的功能是新建项目,实际调用的是ant脚本。
同时,在曹晓刚同志的试用后,QuickStart的效果做了修改,终于达到和我最喜欢的pentaho一样的效果。
Selenium备忘手册
最近的项目准备用Selenium作一部分的Regression Test。在SpringSide里参考了一下,又下了个Selenium IDE玩玩,觉得还蛮容易上手,基本上不需要手动写测试代码。
但实操起来时面对各种复杂的页面情况遇到不少麻烦。感觉Selenium 的offical documentation写的比较high level, 最后找了个though works的ppt,算得上比较全面易懂。匆匆翻译了一下,供后来者参考。
三个完美版完成
1.QuickStart 完美版
之前QuickStart启动Tomcat是以后台方式启动的, 用户看不到tomcat的窗口,也不能以普通方式关闭Tomcat (为了Tomcat启动后不把ant进程杜塞,用了spawn=true参数)
现在在ant 里使用了并行容器, 没有了这个问题.
2.Selenium 完美版
之前Tomcat 与 Selenium Server同样是后台摸黑启动的,现在都改为明版.
原来用firefox作测试浏览器,考虑到firefox的普及率,SS2.0 换回IE当默认测试服务器.
代码简化, 下面是一段Helloworld 增加用户的测试,非常清晰,完全可以省略controller测试.
String userName = "TestUser";
user.open("/helloworld");
user.click("adduser");
user.waitForPageToLoad("5000");
user.type("user.name",userName);
user.click("save");
user.waitForPageToLoad("5000");
assertTrue( user.isTextPresent(userName));
3. 构件安装完美版
前两天的构件安装只负责拷贝jar 和 template文件
今天增加了web.xml ,struts-config.xml 这类文件的自动合并功能.
另外在web/ec 里演示了构件自定义安装脚本,把/meta/taglibs.jsp 的内容append 到主应用的taglibs 里.
备忘录:
selenium 的浏览器设定 ,*firefox, 会在系统的PATH 里找*firefox.exe文件
selenium 使用IE时, proxy机制较特殊,好像需要改注册表,而且与E家宽这种同样以proxy机制提供宽带服务的供应商冲突,需要断网才能正确运行.
SpringSide 2.0 helloworld.war 发布
SpringSide 2.0的文档及下载见:
http://wiki.javascud.org/display/springs/Home
吸取SS1.0的经验,这次三军未动,文档先行。
漫漫长途第一步,完成了Spring+Hibernate+Struts的User管理helloworld搭建,更重要是做了一个新建项目,安装构件的Ant Script框架出来,将extremecomponents, hsqldb,quartz,sitemesh等都切分为构件。用户可以用ant命令新建基础项目,并把其他的构件装入项目。
另外,每一个细微的地方都作了优化,如hsqldb的使用,log的优化,i18n文件的放置等等等等....对比之下觉得SS1.0太多不完美的地方了,强烈建议大家转为关注SpringSide2.0。
SpringSide 1.0 M3 all in one 发布
spring配置文件的更新
1. spring的配置文件可以大量配置<beans default-lazy-init="true">来加快单元测试的速度。
不过注意那些PostFactoryBean 如PropertyPlaceholderConfigurer是不能lazy-init的,否则一不小心吃个大闷亏,还有那些springmvc-servlet.xml 似乎也不能lazy init.
2. 使用PropertyOverrideConfigurer来特别配置单元测试时的JDBC URL
PropertyOverrideConfigurer的详细情况见参考手册的3.7.2.2
<bean id="testPropertyConfigurer" class="org.springframework.beans.factory.config.PropertyOverrideConfigurer"> <property name="location" value="classpath:context/test/test.properties"/> <property name="ignoreInvalidKeys" value="true"/> </bean>
test.properties文件如下
dataSource.url=jdbc:hsqldb:res:default-db
如此配置之下,applicationContext中dataSource bean的url 就会被透明的修改成嵌入式数据的模式。
JDK5.0可变参数减少API数量
find(String hql); find(String hql,Object arg); find(String hql,Object[] arg);
可精简为一个
find(String hql,Object... args);
用户用如下四种方式调用该接口都是合法的
find(hql); find(hql,arg0); find(hql,arg0,arg1); find(hql,new Object[]{arg0,arg1});
唯一一个限制就是,可变参数必须在参数列表的最右。
DWR升级到2.0M3,原来的很多问题都解决了
比如tomcat启动时会有一段warning, 比如IE的bug,比如中文问题需要自己写convertUtil, 这些问题都不存在了。
但是,他的推技术仍然不够成熟,在IE中的表现未如人意。
XFire升级到1.2RC并演示了密码认证的handler
XFire1.2RC比较吸引人的特性有GZip压缩。
david.turing演示的加入验证的流程
1.在webservice-server.xml 中,使用bookService的inHanders属性加入验证用户名密码的Hanlder。
<bean id="bookWebService" parent="baseWebService"> <property name="serviceBean" ref="bookManager"/> <property name="serviceClass" value="org.springside.bookstore.plugins.xfire.service.BookService"/> <property name="inHandlers" ref="authenticationHandler"/> </bean>
2.实现服务端验证用户名密码的authentcationHandler, 见/springside-bookstore/src/.../plugins/xfire/auth目录。
3.在客户端加入负责输入用户名和密码的ClientAuthHandler,见/springside-bookstore/src/.../plugins/xfire/service/client.groovy
return new XFireProxyFactory().create(new ObjectServiceFactory().create(BookService.class),serviceUrl)
修改为
Service serviceModel = new ObjectServiceFactory().create(BookService.class); BookService bookService = (BookService) new XFireProxyFactory().create(serviceModel,serviceUrl); Client client = ((XFireProxy) Proxy.getInvocationHandler(bookService)).getClient(); client.addOutHandler(new ClientAuthHandler()); return bookService;
4.实现负责将用户名和密码加入请求的clientAuthHandler.java。
5.在测试用例中加入用户名和密码,见/springside-bookstore/test/unit/.../plugins/xfire/xxx.FindBookByName.xml,header部分增加了
<env:Header> <AuthenticationToken xmlns="http://service.xfire.plugins.bookstore.springside.org"> <Username>admin</Username> <Password>admin</Password> </AuthenticationToken> </env:Header>
Spring2.0RC2对动态语言集成的升级
新增了一个<lang>的schema, webservice-client.xml 已改为
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:lang="http://www.springframework.org/schema/lang" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd"> <!--Groovy版本的Web Service Client--> <lang:groovy id="BookServiceClient" refresh-check-delay="60000" script-source="classpath:org/springside/bookstore/plugins/xfire/service/BookServiceClient.groovy"> <lang:property name="serviceUrl" value="http://localhost:8080/springside/service/BookService"/> </lang:groovy> </beans>
第一个属性 refresh-check-delay,每隔一段时间扫描一次脚本的变化,reload it。
第二个属性script-source 指向scriptsouce, <lang:property>演绎了Spring最喜爱的IOC,将serviceUr变量注入。
Compass 1.0 发布
Compass 1.0 发布,完整的release notes 见此
下载见此:
http://www.opensymphony.com/compass/download.action
SS已升级compass1.0 及lucene 2.0的jar, compass1.0的sample中已有hightlighted text的例子,ss将跟进修改。
另外,虽然主要是用annotation表达pojo ->lucene mapping,但有空的话也会demo spring 2.0 风格的xml定义文件。
selenium 集成测试放出
在/springside-bookstore/test/functional 里面
另外/springside-core/src/..../test 里面有个小基类。
运行的脚本是/bin/build.bat 然后选functional-test,
可能要大家在/build.properties里面设一下tomcat的路径。另外需要大家装firefox1.5.
同样的,暂时没有文档,大家自己看http://www.openqa.org/selenium/
jbpm 3.1+springmodules-jpbm3.1 的demo放出
一个最简单的,仅仅在下订单后发送JMS消息的工作流,主要demo jbpm workflow 整合的方式
所有源文件及配置文件在/springside-bookstore/src/org/.../plugins/jbpm 内
/springside-bookstore/resources/default-db.script里也加了一堆jbpm相关的表,并初始化了两个jbpm user
在orderManager的placeOrder()函数处对工作流进行了调用。
ActiveMQ(JMS)放出非JVM嵌入式的版本
以前的JVM嵌入式版本只是个玩具演示,dfdfswsw实现了独立运行,可用数据库进行持久化的版本。
另外加入了lingo的演示。
在/springside-bookstore/activemq/ 下是activemq的配置文件及独立运行环境。
/springside-bookstore/src/org../plugins/jms 下除了原来的OrderPlaceMDP外多了很多文件,不过作什么的还没看懂。
最后,乐极生悲,因为不是嵌入式了,需要手工启动/springside-bookstore/activemq/activemq.bat
如果是在单元测试中,还要在启动activemq.bat之前 还要先跑/springside-bookstore/db/server.bat
BIRT2.1的部署与瘦身
2.1. 拷贝文件1
将/plugins, /configuration两个目录复制到webapp 根目录, 将lib复制到webapp/WEB-INF/lib
2.2. 瘦身
Birt实在太过庞大,如果将以上三个目录全拷的话几十M.因此,可以参考SS里对/lib/birt 和 webapp/plugins目录反复试验后的精简。
另外,/lib和/plugins有好多jar是重复的,只要在编译时把jar 从一个目录copy过去就行。又要注意两个目录里相同的jar的命名并不相同,而/plugins里面的文件名很严格,可参考build.xml里的这段复制命令
<copy file="lib/birt/com.ibm.icu-3.4.4.1.jar" tofile="${web.dir}/plugins/com.ibm.icu_3.4.4.1.jar"/>
<copy file="lib/birt/js-2.1.jar" tofile="${web.dir}/plugins/org.mozilla.rhino/lib/js.jar"/>
<copy file="lib/birt/chartengineapi-2.1.jar" tofile="${web.dir}/plugins/org.eclipse.birt.chart.engine_2.1.0.N20060628-1351.jar"/>
<copy todir="${web.dir}/plugins">
<fileset dir="lib/birt">
<include name="org.eclipse.emf.*"/>
</fileset>
</copy>
jbpm预览版与Birt2.1暴肥版
nicholas 加入了jbpm3.1 和 springmodules-jbmp3.1的模块,已完成配置文件的整合,接下来就开始编写实际代码。
Birt升级到2.1 ,不过在新的webapp/plugins目录需要的eclipse 基础jar太多了,整整20M阿,虽然尽量的删减和重用/lib 中的jar,弄了一个晚上,springside的基本发行包还是暴增了6M,从10M扩到15.5M了。
M3改动列表预览版
死了死了,太久没有写开发纪要,现在临发布了才来数碗数碟,会不会数漏?
1. 超级快速体验的springside.bat 一站式安装运行,新手门槛降为0cm。
最新的springside连tomcat5.5都带了,大家只需装个JDK5,设一下JAVA_HOME,双击springside.bat 等一阵就会看到一个SpringSide书店示例的IE窗口呈现在面前。
2. 目录结构大翻滚,大变装,终于斯文大方得体。
对springside-base, springside-bookstore的划分,bookstore目录的多模块开发模式,plugin目录的整理,素来因为整合项目太多而乱糟糟一团麻绳的目录结构终于获得少量同志对其作出"清晰"的评语。
3. 单元测试与集成测试,提高用家信心。
springside-base作为可重用的API,没有足够的单元测是没办法让人放心使用到自己项目中的,所以这个版本开始模仿Spring的测试方法,陆续为springside-base中的API补上测试用例。最高目标是,no test case, no sourcecode commit。
另外,基于Selenium的集成测试在这个版本里也已经加入,第一步做了前台图书搜索的测试。陆续将覆盖到所有页面流程,保证经常发神经重构也不影响SS的可运行性。
另外,daoTest 改成了HSQLDB in Process的运行模式,无须再手工开停hsqldb,Controller Test的配置文件经过调整,也避免了以前因为bookstore-serverlet 在WEB-INF中不在class path中,用IDE无法方便运行的问题。
4. JDK1.4版的war。
retrotranslator 1.0.7版终于完全可用了,大家build的时候选war14即会在release目录生成jdk1.4版的war, 已在JDK1.4+Tomcat 5.0上运行成功。
5. Compass的完全演示
加入图书分类搜索的限定,对之前的not best的Compass应用作了修正,目前除了等Compass 0.92的新highlight方案外,整个演示已经比较满意。
6.Acegi 使用的增强
更换了验证码的图片引擎;对资源分模块管理;加入页面中的对象授权的taglib;一些bug fix
7. 分页的增强
提供了前台的分页taglib, HSQL和Critera的分页实现类参考Robbin的代码增加了通过count方式获得total count的方式。
8.开始加入DOJO
DOJO的人气太旺盛了,另外一个是Sun的JMaki,两者结合起来,html 多了一堆富客户端的widgets。
9.其他更新
在war时将jsp移动到/web-inf/pages;
hbm2ddl 的task;
用freemarker template 生成html格式的邮件
10.Library 升级
Spring 2.0 RC2
Birt 2.1
SpringSide大转型
1.0M2发布后,SpringSide的重点将从自我的探索转向用户推广与实战应用。
一睡醒就想做的一样事情是使用无敌的IDEA,花一个上午把目录重新拆分为BookStore-Sample, SpringSide-Base,SpringSide-modules三部分。其中:
BookStore-Sample是一个Full Feature的书店sample,兼有有前台展示和后台管理,作为比较典型的企业应用的微缩版。
SpringSide-Base 是SpringSide的核心封装代码与构建一个CRUD后台管理程序所必需的full-stack代码库。用户基于SpringSide-Base能快速搭建出自己的CRUD管理后台及安全管理程序。
SpringSide-Modules 以modules形式提供了除前面的基本CRUD及安全管理外的企业特征如JBoss Rules, Compass-Lucene,BIRT report ,用户可以快速复制到自己的项目里。
接下来就是Eclipse Plugin/Ant 脚本实现的CRUD代码自动生成 和 文档教程的编写细化。
目前SpringSide-Base有了初步的样子,SpringSide-Modules也有了第一个模块:
配置好,精简过的FCKEditor 2.3正式版 2.3版比2.2版号称快了很多, 而2.3版比之前的2.3 b,又有了Office2003的skin.
SpringSide 1.0M2发布
Release Notes: http://www.springside.org.cn/docs/reference/ReleaseNotes/V1.0M2.htm
最后一天改了差沙改了Jcaptcha验证码,acl也开始在页面起作用了。
helloboys改了Compass的复杂查询。
做的过程中不断有bug要修正,把这么多东西摆在一起运行真不容易啊。
终于可以开始结构大改到谁都不认得 1.0M3了。以前老想一边demo,一边提供可copy的模版代码,结果两样都作不好。
现在想开了,分两个目录,一个专门负责demo,一个专门提供copy,反而更好。
cac旅游归来,重新开始更新
*升级到Commons-validation 1.3和 springmodules-validation-0.4
两者终于兼容,可以同时升级到最新版本
*cac增加前台的Ajax分页效果, 还是用Prototype.js简单完成。
*点击单本图书时的Effective效果。
*加入acegi 1.0新出的logoutFilter和securityContextHolderAwareRequestFilter,现在logout时干脆了很多。
*文档升级和一堆bug修正,代码小升级,比如著名的操作员增加失败bug。
等差沙补上Jcaptcha验证码和acl的文档,hellboys的Compass复杂查询就可以发布1.0M2了。(有空的话再看看DWR启动那个错有没有可能去除)
终于把前天想到的7,8处地方,可以安心过周末了
本来一想起ss还有这么多难看的地方就浑身不舒服。
1. Compass:
采用Annotation式简单标注POJO到lucene的影射,再不需要长长的xml文件。
美化了页面。
Compass 要求Book和Product要有equals等函数
采用Commons-lang的EqualsBuilder,HashCodeBuilder,ToStringBuilder 简写Product,Book的这几个函数。
public boolean equals(Object o) {
return EqualsBuilder.reflectionEquals(this, o);
}留意Book的equals,hashcode,tostring函数里还要包括父类Procuct的变量,因此需写成
public boolean equals(Object o) {
return EqualsBuilder.reflectionEquals(this, o, false, Product.class);
}Drools:
过了一遍Drools终于在rc3中补全的文档,明白了一些东西,又大大重构了一把。
ExtremeTable 1.0.1:
看半天,收获就是每个<ec:table> 里不需要再定义imagePath了,在properties文件里定义即可,ec会自动为其加上contextPath 如/springside
更新了文档。
AOP+Ehacache:
Spring AOP2.0的文档终于补齐,小改了下文档,小小重构了一下代码更加清晰,flushing cache支持以分割符定义多个需要更新的cache
Bug Fix:
HSQLListener 换了一种关闭方法,在Tomcat Reload时一般能够顺利重启了。
修正BaseDao中sortCriterator()方法不能自动处理modify_user.name 式排序的bug。
增加AbstractHibernateDao.java的 filterCriteria的默认实现
Spring 新的BaseTest 是autowire by Type的,必须对ruleTemplate 用到的ruleTemplate进行修改
另外对Spring 配置文件有了点新发现,比如声明类型为String[], 在配置文件里写 a,b,c 就会被自动切割。
继续挥汗如雨
Acegi1.0终于出来了,ACL,文档和例子都加强了,另有改动达80处,等待差沙和cac的研究。
extreme components也升到1.0.1 正式版。
今天试用hibernate的event listener 拦截所有historyable对象的修改前后数值
Drools RulebaseLoader重构,尤其是dsl loader,支持dsl->drl mapping的方式
cac在BaseHibernateDao 增加了一个查询书名有没有重复的通用函数,见BookManageController.java的onSave()
另有很多细微修改,比如JavaDoc 所有错误的修复,比如用Spring的FileCopyUtils 在hsqllistener代替了自己的,等等等等。
但回家的路上,数了下居然还有7,8个明显不完善的地方要修改。强烈等待大家加入帮忙!!!!
继续SP2
* 加入了一个VersionableEntity接口,里面有createTime/User modifyTime/User的get/set函数。
实现了此接口的领域对象,在BaseHibernateDao的save()函数中会自动为此对象设置create/modify Time 在BaseManage的bindObject()函数中自动为此对象设置ceate/modify user 和create/modify time
* Compass文档 by 地狱男爵
* 尝试加入Spring Modules的cache 模块,配置较繁锁,非Spring 2.0风格,最后放弃,refactor了一下自写cache模块算数。
为了保持best practice,急急手发布SP1
为M1发布了SP1,内容包括
*Drools的文档
*Compass的更佳应用demo并升级到Compass 0.9.1,使用compass提供的默认index和search spring mvc controller而不再使用自己写的。这个其实是SP1发布的主因,not best practice的东西发布出去了,当然要尽快追回。
*可配置的常量,实施工程师可以配置springside.properties等配置文件来改变Contants的初始值,但仍保留变量的static,final特征
1.0M1 发布,支持FireFox
cac终于把整个后台改成支持ff的模式。
1.0 M1 发布,relase notes见http://www.springside.org.cn/docs/reference/ReleaseNotes/V1.0M1.htm
最后更新
ajax在applicationContext-aop.xml 演示了很好看的Spring 2.0 AOP+AspectJ pointcut
另外Spring终于升到2.0M4, 因此Compass也必须升到0.9.1 Snapshot,另外修改了groovy和spring aop的两处地方来配合升级。
竹篮打水--不留意开源方案重做轮子的后果
今天和ajax好费劲才把Aop+Ehcache 架构调整到比较满意的模式, 一回头发现Spring Modules 0.3已经提供了同样的功能,虽然Spring Modules的东西一如既往的定义繁琐,但毕竟支持的情况比较灵活,还同时支持各种的Cache方案,决定明天再费点劲升级到它的方案。
也不是没收获,对Spring AOP比较熟悉了,Rod写的那本书描述的比较好。
继续重构和注释SpringSide Framework部分,算是搞完了。
另外昨晚又大找sf上的参考方案,算是找到了一个比较多util类的,有空看看。
好多人同时干活,掀起一个小高潮
scud 把 Subversion设为必须编写注释才能提交,正好纪录今天的修改----------
Drools:drl 的语法作了简化,同时ruleBaseLoader支持pattern 通配符来添加drl 以及xls 文件。
现在的drools比较好用了,只要用在xml文件以通配符定义一堆drl文件
在客户代码里用droolsTemplate的 public List executeRules(List facts, String ruleGroupName)方法执行一下即可,不用关心任何的底层API.(schweigen,calvin)
AOP+Ehcache 体系大改动:使用AOP自动Cache 缺货图书,未发送订单等方法的执行结果,同样用AOP自动在图书和订单更改时使Cache失效。 这个AOP+Ehcache方法是通用的,可以使用AOP批量定义需要缓存的方法。(ajax, calvin)
ExtremeTable 升级到1.0.1RC3: 昨天才升到RC2.....除了以前hibernate category.name 不能排序的bug,Excel导出出错的bug (差沙,calvin)
SaleReportManager 使用JDBC Template : JDBC Template 的queryFormRowSet()返回的RowSet和ResultSet差不多,可以当一个JDBC Utils使用。(calvin)
其他改动包括: 文档,注释的补充,BookDaoTest牵涉到acegi时的解决方法,acegi, compass,webwork的小改动。(calvin,李李,cac,差沙)
开始收敛--升级library到最新版,补充文档,除bug,微型refactor
XFire1.1 RC1 升级到 XFire1.1
extremeTable 升级为1.0.1 RC2,取消SpringSide的extremeTable SubProject, 原来的一些bug也随着升级自然修正
FckEditor 2.2 升级到 2.3 beta, 载入速度快3倍,而且不再那么容易出错
重写《旅游指南》 和 《源码目录说明》 文档, 修正了其他一些文档。
spring-commons-validator 小改进,不过始终没办法升级到spring-modules0.3版的commons-validator
另有很多小家务小改动。
1.0M1最后一批新特征加入 DWR2.0推技术 和 AOP+Ehcache
@_@搞定了DWR2.0的推技术
Ajax 搞定了AOP+Ehcache 缓存方法结果集
再细化一下,补一下文档就可以发布1.0 M1了
Open Session In View探讨
在没有使用Spring提供的Open Session In View情况下,因需要在service(or Dao)层里把session关闭,所以lazy loading 为true的话,要在应用层内把关系集合都初始化,如 company.getEmployees(),否则Hibernate抛session already closed Exception; Open Session In View提供了一种简便的方法,较好地解决了lazy loading问题.
它有两种配置方式OpenSessionInViewInterceptor和OpenSessionInViewFilter(具体参看SpringSide),功能相同,只是一个在web.xml配置,另一个在application.xml配置而已。
Open Session In View在request把session绑定到当前thread期间一直保持hibernate session在open状态,使session在request的整个期间都可以使用,如在View层里PO也可以lazy loading数据,如 ${ company.employees }。当View 层逻辑完成后,才会通过Filter的doFilter方法或Interceptor的postHandle方法自动关闭session。
查看全文
规范化我们的JAVADOC
虽然现在springside代码的注释也不算少,但还是写得不规范,生成的javadoc非常没有卖相。看看spring的doc,会发现老外的doc写得帅多了。希望各位同学在开发的时候注意一下,规范一下doc的写法,如类doc记得写@version,@auth,@since, 方法doc里加多点@param,@return, @throws, @exception, 多用@see,@link来加强类,方法间的粘滞性,详细可见一篇中文JAVADOC规范(http://www.iplab.cs.tsukuba.ac.jp/~liuxj/jdk1.2/zh/docs/tooldocs/win32/javadoc.html) 。向spring看齐,让springside正规化 ^_^
SpringSide Summer Code, 51长假之后的大升级
*万众期待的Drools 3 demo 终于由Schweigen初步完成,充满诱惑的dsl 版和excel 版规则引擎。
*传说中大幅简化Lucene,并与Spring,Hibernate结合的compass也由nkoffee完成。
*Webwork也终于等到李李出手。
*XFire, Smallnest 完成了UnitTest和WSDL->Java Ant Task的demo ,并升级到XFire1.1 RC1。
*Acegi又被cac大改了一遍。
另外被升级的还有DWR 升级到 2.0M2; SiteMesh升级到CVS 2006.2月版,修正了Filter的bug。
刚刚提交代码还没细化,暂时也缺文档,将在近期内进行完善并发布1.0M1.
SpringSide 升级为JDK5.0
因为有了Retrotranslator,可以让JDK5的代码一行不改部署到JDK1.4的应用服务器上,SpringSide终于可以放心升级到JDK5.0了。
关于retrotranslator的介绍见http://www.blogjava.net/calvin/archive/2006/04/27/43443.html
升级后的第一批改动是使用了泛型的BaseHibernateDao,子类的代码更加简洁,getEntityClass(),get(id)等函数都取消了。
然后是当然的autoboxing和for loops enhance。
最后,在build.xml里面增加了一个jdk14的target,保证代码能够在JDK1.4上运行
SpringSide 1.0 开发计划
JDK5.0 升级 --calvin (finish)
升级5.0并通过Retrotranslator保证代码可在1.4上正常运行。使用JDK5的特征改进原有代码
Acegi的ACL -- cac, 差沙
Drools 3.0 -- Schweigen,Yilimin
规则引擎 Drools 3.0的规则语言,DSL语言已直追JRules,让人非常兴奋。 从数据库中读取drl的模块暂时放弃。
Compass - nkoffee, 虚位以待
Compass是对Lucene的封装及对SPring,Hibernate集成的框架。
Pentaho --马伟, 虚位以待
开源商业智能解决方案
More Xfire -- Smallnest, 虚位以待
随着1.1的升级,加强ws-security, 单元测试,wsdl2java ,log与错误控制等方面的demo
More Birt 2.0--JustBegin, 虚位以待
完善Birt的各项功能的演示
WebWork演示--李李, 虚位以待第一步先演示后台图书管理界面的CRUD.
Hibernate Annotation - netfishx,虚位以待
Annotation版的Hibernate, 干掉hbm.
AOP+Ehcache演示 --Ajax, 虚位以待
使用AOP 透明缓存方法返回数据,并研究 Spring2.0下的AOP特征
FireFox兼容 --虚位以待
前后台页面要兼容FireFox
升级ExtremeTable和SiteMesh --kevin,calvin
使用最新版本,减少SubProject
神秘人就是等待大家加入的意思。
初步移植EasyMock2.2 到JDK1.4
EasyMock 2.0 已经把其他mock方案抛在后面
但它大量应用了泛型等特征,官方要求JDK5.0. 因此我们使用了Retroweaver将其移植到JDK1.4。另外,有两个文件需要手工修改,发布在SpringSide的subproject:
http://svn.javascud.org/svn/springside/subprojects/easymock/
如果是直接使用,直接复制dist里的三个jar即可。
如果你在使用中发现还有文件没修改干净,请按/doc/ReadMe.txt的做法,继续修改,并请把结果反馈回ss:)
(注,因为后来找到了Retrotranslator,一行未改就能在JDK1.4上运行,子项目取消)
Pragmatic Bookshelf 书讯
Pragmatic 系列真好,前几天刚刚出版的就可以emule了:
最新的几本:
《Practices.of.an.Agile.Developer.Working.in.the.Real.World》
《Rails Recipes》 --Ruby on Rails Cookbook
《Ship It! A Practical Guide to Successful Software Projects》
《Best.of.Ruby.Quiz.Volume-1》-Ruby Quiz,无聊时可以看
SpringSide 0.8 stable版 发布
Ajax 熬夜把Hibernate分页与Extreme Table结合的代码搞出来了,再加上大家不断反馈不断加强的文档,0.8正式版终于发布。
周末就可以玩1.0版的feature了.
为了便于开发,一些plugin可以会移回主目录来开发,临近发布才会重新切成plugins.
在项目实践中的SpringSide
常有新加入的同学问:SpringSide能用在实际项目开发中吗?为了打消大家疑虑, 增强一下大家的信心, 把我这几个月学习SpringSide做的项目向大家展示一下, 大家会发觉, 原来SpringSide可以有这么多种玩法 ^_^
查看全文
Hibernate HQL 终于有了分页
水木Spring今天做了个比较优雅的Hibernate HQL分页方案。参考Hibernate Wiki上的做法,利用scroll得到总数,当jdbc driver不支持scroll时,采用list。
最后还剩一个Criteria版的分页,0.8版就完成了。
冷清的周末
天氣好冷,今天的更新也比較冷清。
Ajax:
@_@ 對Ajax加了觀察者模式,做到ajax與搜索引擎friendly兩不誤。
Bug Fix:
修改了UnitTest中的的bug.
Document:
Cac又写了一点Acegi的文档,不过写的那个是相当深奥,名词用的是相当专业。
貌似可以發佈0.8正式版,然後鋪開1.0的feature了
如果没有什么更新,就升级lib和注释
MM的注释仍然在继续.
1.Acegi:
差沙对那个中文版applicationContext.xml又进行了注释。
2.Jar升级: Quartz1.5.1->1.5.2
OSCache 2.2 -> 2.3
都是没有特别功能需要,闲着没事的升级。Maven官方站等了一个月都没有升级它们,又是靠私服搞定。
3. XFire的注释和文档