2005年11月11日
摘要: 最近都实在憋不出什么花团锦簇的大块文章,还是安心在微博里碎碎念算了。
地址: http://t.sina.com.cn/calvin1978 ,大家互相关注一下哦。 阅读全文
摘要: 大众搬屋版里, 不断将工作项目中的代码片段移植过来,而且这种搬运的幸福感估计还会下面的几个版本中延续。 阅读全文
摘要: 现在的书都好厉害,《高效程序员的45个习惯》,《软件架构师应该知道的97件事》.....但总觉得自己就是个FIFO的管道,看完后基本没记住什么。
或许这个喧嚣而碎片化的年代,惟有屈指可数的东西,才能可能真正被时时记起,践行吧。在公车上强迫着自己从十多年轻轻重重的实践中,砍剩最后的几样非如此不可,且无处不可的实践:
阅读全文
摘要: Hmm...居然还差半个月就有半年没发新版了,long time no see 啊。 至于原因嘛,与Tim讲的 有点相似。
好在公司的新项目选型都与SS接近,所以新代码里其实有很多是亲爱的同事们的手笔, 不再是一个人在战斗了。
BTW. 回头一看,这里好像只剩下SpringSide的更新记录,其余的连草都没有了。
现在工作稳定,是时候出宫了。 阅读全文
摘要: 最近国内的开源项目非常生猛,与Play!Framework有些相近的斗鱼,也是要替代SSH的Nutz, 已经支持Spring 3.0与iBatis 3的Rapid framework 3.0, 在这个好像特别寒冷的年末,俨然一道鲜亮的风景。
SpringSide也发新版了,相比之下创新性有点欠奉,更像是一本日记,将这两三个月里遇到的代码记录下来与大家分享。 阅读全文
摘要: 作为3.1系列的最后一个版本,3.1.8版的代码质量在 Hudson + Sonar 双塔控制下,慢慢开始好转了. 阅读全文
摘要: SSO方案中太多平行对称的分支选择,就像博而赫斯那小径分岔的花园。刚手写完一个超迷你劲袖珍的SSO,顺着 SAML2.0和OpenID的规范,记录一下这些分岔点。 阅读全文
摘要: 又过一年了,更新一次自己的ESB笔记,内容实在,枯燥无味,浓缩即精华....年度最大发现应该是Fuse ESB 4.0吧。 阅读全文
摘要: 背景音乐:《要不要就一起加入GCD》,唱:陈珊妮,词:夏宇。
JDK5是一个巨大的转折点(泛型,Annotation,并发...),而JDK6就是一个可安全升级的加强版,对新项目是不升白不升,白升谁不升,而对旧项目就是升了也白升,不升也没啥损失吧。 阅读全文
摘要: 年又过年,去年在写在译的书又长出了一茬,又是时候订一份今年的读书计划。 阅读全文
摘要: 3.1.2是连跳了3.1.0和3.1.1两个版本后的GA版本,一边忙着Mini-Example这一亩三分地的升级,一边开始Showcase的演示...... 阅读全文
摘要: 没人知道多如牛毛的传统MVC框架中哪个是最好的,但就像硬件界买IBM不会犯错一样,Struts2.1也应该是未来一段时间里安全的选择,特别是企业里有N多开发团队和开发人员的时候。
阅读全文
摘要: 年末最后一天,昭事上帝 ,聿怀多福,祈望来年的Java社区争气一点,实现偶们小小的愿望... 阅读全文
摘要: 对于演示原型 ,上午要下午给的快速交付,或者某些不知道到底一年有多少个人点进去的网站角落,或者极少数管理人员才用到的管理功能,在恨不能php,ror的时候,你会想起jsp+jdbc的温暖。
又或者你请到了只会写jsp和sql的极品,又想让他明天开始干活.....
所以另做了这个extreme-web风格示例 , 在简化到no config file的jsp+jdbc同时,仍然是个可堪一观的MVC,仍然基于亲爱的Spring.
阅读全文
摘要: 怀胎十八个月的SpringSide 3.0 终于低调的发布了。
这个版本里的SpringSide,终于放弃梦想,不再奢望做一个框架,或者一个像RoR/Gails那样极简的、创新的封装,唯余对如何用不轻也不重的主流选型、编程实践来开发JavaEE企业应用的老老实实的总结。 阅读全文
摘要: GC调优是个很实验很伽利略的活儿,最后服务的处理速度从1180 tps 上升到1380 tps,调整两个参数提升17%的性能还是笔很划算的买卖..... 阅读全文
摘要: 与Mule 2.0抵死缠绵了两周,喜忧掺半。但只在2.0之后,Mule才算真正站到了ESB的起跑线上。
完整的笔记见我的Wiki: http://wiki.springside.org.cn/display/calvin/Mule , 这里主要列一下实际的升级感受。
阅读全文
摘要: 江湖上多的是功能华丽的项目原型/骨架生成工具,但最后,反而是功能简单的Maven Archetypes渐渐有了一统的希望。
无它,先把自己收拾得简单易用,然后作为一个江湖大佬(maven)的"官方"小弟,再有另一些江湖大佬(appfuse,strust2,cxf)使用示范一下,就是现在的上位秘诀。
阅读全文
摘要: ICP的审查员们都严查谣言去了么?最艰难的一次ICP注册,让SpringSide关站至今。4月份里填错了两次接入商,而5月份就一直静止在"待管局审核"的阶段。
6月份,终于通过了。
http://svn.javascud.org/svn/springside/springside3/trunk 阅读全文
摘要: TerraCotta 通过将POJO对象在群集内下的共享,让POJO不再局限于SNA(Share Nothing Architect)的架构,比较透明的支持了集群模式,可谓POJO开发模型的最后一块拼图。 阅读全文
摘要: 为了2007年的目标,列了下面待读或重读的书单。
不在书单里的,小部分是我漏掉的,大部分是我觉得对于架构师不太重要,或者不够好的。
奇怪国外真正的好书来来去去也就那么几本,emule加上国内出版社的努力,我们看的东西和老外已差不多,为什么老外看完就那么生猛,我们看完就还是半桶水呢。 阅读全文
[摘要]Spring发了2.0,Struts发了2.0,SS也来凑凑2.0的热闹。下载地址:http://www.springside.org.cn/download.php
SpringSide 2.0改用了Pragmatic版的Struts作为MVC主打框架,重写了所有的代码,增加了新项目生成的命令和构件化的开源栈,还增加了方便新手入门的Helloworld示例。
随着Java开源社区的日日进步,SpringSide升级了包括Spring 2.0的AOP事务配置, Hibernate3.2的annotation模式,XFire1.2.2的最新简约配置及JSR181模式,以及ActiveMQ4.1 的Message Driven POJO新模式。
另外,还增加了iBatis数据访问模式和一系列Ajax Widgets,并全面推行了Selenium集成测试。
全文地址:http://blog.csdn.net/calvinxiu/archive/2006/11/28/1417730.aspx
这篇文档是专门写给那些编程狂热者,在Ant里编程时要留意的重要Task。
不知为何,老外的各种脚本都写得格外漂亮。从Appfuse里学到很多,在编写SpringSide2.0的构件安装脚本时又被迫自学了不少,这里作下总结。
全文地址: http://blog.csdn.net/calvinxiu/archive/2006/09/07/1187329.aspx
摘要: 虽然现在已是Web Server, Web Service的天下,但偶然还是会因为性能苛刻,或者需要自定义协议的原因,很无辜的要自己做一个Multi-Thread,Multi-Client的Tcp Server。 超简单的QuickServer,让你专心编写自己的业务代码, 不用编写一行Tcp代码。[阅读全文] 阅读全文
摘要: Nutch是一个基于Lucene,类似Google的完整网络搜索引擎解决方案,基于Hadoop的分布式处理模型保证了系统的性能,类似Eclipse的插件机制保证了系统的可客户化,而且很容易集成到自己的应用之中。
Nutch 0.8 完全使用Hadoop重写了骨干代码,另外很多地方作了合理化修正,非常值得升级。[阅读全文]
阅读全文
摘要: 这个版本将是SpringSide1.0范围内最后一个跑马圈地,开疆拓土的版本。从下一个版本开始,将会把主要精力放在代码的细化,文档与测试用例的补充,以及在实际项目中的应用。
这个版本除了继续跑马圈地外,也对代码结构作了很多遍重构,终于使复杂的项目以比较顺眼的方式组织起来了。
阅读全文
SpringSide是一个以Spring Framework为核心,Pragmatic风格的企业应用开发基础和最佳实践展示。 为使用Spring框架的开发者提供一个非Demo版的复杂、正式且体现最佳使用实践的参照系统。为JavaEEer必须面对的问题提供合乎Pragmatic原则的解决方案。
当然,要等待大家拍砖过后,上述表述才会成立。
SpringSide主要包含四个部分--
-
BookStore-Sample: 一个Full Feature的书店示例,兼有有书店前台和后台管理,作为典型企业应用的微缩版。
-
SpringSide-Base:SpringSide的核心封装代码与构建一个CRUD管理后台所必需的full-stack代码库。用户在其基础上能快速搭建出自己的管理后台及安全管理程序。 (建设中)
-
SpringSide-Modules: 以modules形式提供了其他的企业特征如XFire WebService,JBoss Rule engine,BIRT report,用户可以快速复制应用到自己的项目。 (建设中)
-
Rails-Generator: 自动整合SpringSide-Base/Modules生成项目,生成CRUD代码的Eclipse Plugins 和Ant 脚本。 (建设中)
官方站点: http://www.springside.org.cn 下载地址: http://www.springside.org.cn/download.php 演示站点: http://demo.springside.org.cn:8080/springside/ 升级概述:终于从春天走到了夏天第二版,上一个版本的发布比较匆忙,Bug一堆,1.0 M2版作了大量补救的工作,改进了JBoss Rules ,Compass, Acegi部分使它们贴近了一点"best practice demo"的目标。另外还有很多很多的文档补全与Bug修正。
尽管代码里还是有Bug,但为了把SpringSide用于实际项目的1.0M3计划的开始,先把1.0M2发布出来,希望大家能帮忙数数bug,提提建议,更欢迎大家加入到SpringSide的开发团队 。
主要更新:
-
Compass更新: 使用简单的Annotation代替复杂的xml映射文件,再换上Compass提供的默认的Index和Search Controller,使得Lucene的使用成本降到平民团队的程度。另外还加上了复杂查询的Demo,完整的文档,So Cool。
-
JBoss Rules更新:JBoss Rules出到正式版3.0.1,官方文档也已经补全。在读完官方文档后,改进了之前的封装和Demo。
不过JBoss Rules的Road Map告诉我们,它还在升级规则存储管理的模块,暂时不用自行扩展。
-
Acegi 更新: Acegi出到正式版1.0,在订单管理部分初步加入ACL控制,还有JCaptcha验证码的加入及登陆超时,Logout Filter等特征的使用。
-
其他实用性改进:比如可用Propertity修改的Base Constants;增加了一个查询属性如图书名有没有重复的通用函数;增加一个historyable接口,BindObject函数会自动为实现了该接口的ceate/modify user 和create/modify time,并用Hibernate Event Listener侦听修改记录;增加了前台Ajax分页的简单演示。
其他修改:见 团队开发日志
其他依赖包升级:
-
extreme components 1.0.1 看半天,收获就是每个<ec:table> 里不需要再定义imagePath了,在properties文件里定义即可,ec会自动为其加上contextPath 如/springside。
-
Commons-Validator 1.3 + SpringModules-validation 0.4 使用hotfix的springmodules版本,两者的最新版终于走在一起了。
本期开发人员介绍:
-
差沙:本期MVP队员,为SpringSide加入了JCaptcha验证码和订单管理的Acegi ACL实现,ACL的实现侧显了差沙强劲的编码爆发力,而JCaptcha的引入过程暴露了差沙无物不破的Fix Issue能力。最后差沙已正式升级为SpirngSide核心开发团员。
-
地狱男爵:接过nkoffee的棒,把Compass的Feature表现得简单而强大。
-
cac(陈俊):SpringSide的大内总管,承担了SpringSide大部分的代码改进,Bug修正和页面优化的工作,尤其在1.0M2的最后发布阶段,每天熬过半夜连续挑掉了无数问题。
-
李李:补充了WebWork的文档,简化了Webwork的应用,bba96框架也升级到bba96-tiger1.0-beta3。
-
schweigen:补充了JBoss Rules的文档。
-
江南白衣:咳。
重要的1.0 M3 开发计划见http://jira.javascud.org/browse/SPRINGSIDE 共23个任务,其中核心任务有SpringSide-Base建设、Acegi应用的再次升级、BIRT应用的再次升级、JBpm的加入、dojo和Sun的Html widgets 集成taglib大加入、Spring 2.0RC1的升级。 欢迎大家加入SpringSide开发团队,凑个热闹,共襄盛举。
最后特别感谢scud的JavaScud开源服务平台(http://www.javascud.org) 为 SpringSide提供的系列服务.
摘要: Prototype.js 是Javascript编写者的一把小军刀,提供了很多Ruby风格简写语法和实效的函数,更难得的是完全跨浏览器,让大家舒舒服服写出又精简又不用愁心兼容的的JS代码,springside 已经离不开它了。 阅读全文
1.TheServerside.com 依然是地位无可动摇的CCTV1。
2.InfoQ.com Floyd Marinescu 在离开 TSS 后另起炉灶,2006年中最重要推荐。视野不再局限于Java 而是包括Java,.Net, Ruby ,SOA, Agile方法等热门话题。
3.JDJ的电子杂志 在JDJ首页的最底处订阅,文章质量不低于5-7的传统三强。
4.SWik.net 收集了大量OpenSource Project的资源聚合。其中如Spring,Hibernate的更新度非常高,出现什么和Spring有关的blog,article,project都会马上被聚合。
5.IBM DeveloperWorks 传统、稳定的Java文章来源地。
6.JavaWorld 传统、稳定的Java文章来源地。
7.OnJava 传统、稳定的Java文章来源地。
8.Artima.com 类似于TSS而略逊,其中Spotlight 文章值得关注,而Java News是聚合了所有其他Java站点的大聚合。
9.JavaLobby 站内的Announcements 是大大小小Java Project的发布声明区,Trips and Tricks 有很多的Tips。
10. No Fluff Just Stuff 的Blogs 聚合 一直缺一个所有优秀Java Blogger的rss总聚合,NFJS这里勉强算一个。
摘要: 作为一个架构设计师,只应该上述的第2,3项特征,一是在框架类里配合使用反射和泛型,使框架的能力更强; 二是采用收敛特征,本着对人民负责的精神,用泛型使框架更加类型安全,更少强制类型转换。
同时,老被人骂的擦拭法其实避免了Java的流血分裂。 阅读全文
摘要: 因为Retrotranslator的出现,SpringSide 1.0终于放心升到JDK5.0,并保证仍然100%可以运行在JDK1.4的服务器上。
和Retroweaver一样,大家直接用JDK5开发,最后通过ASM转换到JDK1.4的字节码,部署到JDK1.4的运行环境。但它不仅支持JDK5的语法,还支持JDK5的新增API。 阅读全文
摘要: 当王家卫遇到杜可风,Spring遇到Ruby。想出这个题目的Crraig Walls 绝对也是个八卦种子,宣传的是Spring 2.0m2集成动态语言的feature。 阅读全文
摘要: 《Effecitve Enterprise Java》的一个实践。 阅读全文
摘要: 看着log4j-2.13.jar被每个项目每个版本里一次又一次无限下载,你就会觉得用Maven2 管理Library实在很环保。
而且,Java的类库也急需摆脱这种无身份无地位一个jar包随处摆放的境况。Maven给Jar以名份是一个好方向。
阅读全文
摘要: 有个地方恰似美好未来,就是被赶鸭子上架的springside了。
阅读全文
摘要: SourceForge用了许多年,最近才靠springside混进了它的后台。八卦一把去sf混个房间有什么好处,还有它以什么规则,维持这么大一间善堂的运作。 阅读全文
摘要: 似乎老外有这个习惯,逢年过节都会推荐一些书大家在家里充电。 阅读全文
作者: 江南白衣 JDBC有够慢的,出到了3.0了才有个Rowset能类似于windows下ADO的概念,却还是达不到ADO.net的水平。幸亏Java里ORM这块比较争气,趁着C#的ObjectSpace跳票,可以继续耀武扬威。
Rowset对比于ResultSet,除了不用保持Connecton外,更重要特点是能够类似于ADO的编程方式,直接对Row赋值来进行Insert与Update, 而不用写SQL语句。 在windows编程中经常可见这种模式,特别是ADO.net用的好时,ORM也只能算是锦上添花....
在oracle的sample代码中,rowset02.java完整demo了RowSet的ADO模式。 简化后的代码如下:
public class RowSet02 { public static void main (String []args) { try { OracleCachedRowSet crowset = new OracleCachedRowSet (); crowset.setUrl (java:oracle:oci8:@); crowset.setUsername ("hr"); crowset.setPassword ("hr"); /*Select*/ crowset.setCommand ("SELECT seatno, tdate, name, class FROM reservation"); crowset.execute (); System.out.println ("Seat no Travel Date Name Class"); while (crowset.next ()) { printRow (crowset); } crowset.setReadOnly (false); /*Update*/ crowset.beforeFirst (); if (crowset.absolute (2)) { crowset.updateString (4, "Business"); crowset.updateRow (); }
/*Insert*/ crowset.beforeFirst (); crowset.moveToInsertRow (); crowset.updateInt (1, 107); crowset.updateDate (2, new Date (975915381774L)); crowset.updateString (3, "Pluto"); crowset.insertRow ();
/*Delete*/ crowset.beforeFirst (); if (crowset.absolute (6)) { crowset.deleteRow (); } crowset.acceptChanges (); crowset.close (); } catch (SQLException ea) { ea.printStackTrace (); } } }
作者: 江南白衣 上次FB的吹水摘录: 除JDBC外的数据访问技术包括EJB,Hibernate,JDO,iBatis等,但凡是ORM的总要面对相同的困境,如果透明持久化的,苦恼就更多 --Java数据访问技术依然在缓慢跨越鸿沟,.Net社区的同学用不着眼热心跳: 1.查询语言--纷纷重回原来极想摆脱的sql,但实现得又不如SQL成熟。 因为QueryObject,Criteria API的可读性太差,最后所有技术方案都回到它们原来一力想摆脱的SQL的路上。而且,因为是重新仓促设计,都不如sql 的成熟,总有很多做不到的地方。像刚开始的EJB QL,几乎什么都做不了,而hibernate 3.0 HQL把h2的代码抛弃了重新实现才达到相对满意的水平。 2.积极载入和懒惰载入--不能如sql般每次随需定制
ORM与jdbc访问的区别,就是以包含关联对象的对象,而不是以sql自由定制的ResultSet,作为数据载入的主体。 积极载入策略在载入订单对象时,会接着载入顾客对象、产品对象,而如果产品对象又包含类别对象时.....整个数据库被拖了一小半出来。即使不玩连连看,clob对象的胡乱载入就够头痛了。 与此对应的就是懒惰载入策略,比如EJB的初始版本,据闻每个属性查询一次数据库,数据库往返次数多得吓人。 ORM方案会让用户自行定义这两种策略来达到平衡。一般默认采用积极载入,在一对多关联上定义lazy load,还有统一定义积极载入的层数。到了hibernate 3,更可以在列级别上定义lazy load。 问题是,上述的定义都在hbm文件, 每种对象的载入策略只能定义一次。而不能像jdbc那样, 根据不同的情况select不同的结果列。 顺带一个问题是那些信息不完全对象,比如产品只有序号和名字,不带其他信息时,在一个纯面向对象环境里不好表示,hibernate提供的component方案也不是太好。 3.透明持久化--对POJO的一些临时操作也会被持久化 因为持久化是透明的,很容易就会误用,对POJO进行的一些临时操作,一不小心就被保存进数据库中。再加上Session,事务的混乱,远远没有用jdbc跑DML语句那么容易搞清楚发生的事情。 而且,不是每个程序员都能习惯新的透明持久化环境,都对所用ORM系统的持久化策略理解深刻。何况这些策略以及整合它们的框架如Spring,还经常毫无提示的在升级时发生改动!!! 所以,每个使用ORM的团队,在项目过程里总会有闹鬼的几天......
从晚上六点开始聊到十一点,一群恐怖的聊天动物,隔壁桌的三姑妈六姨婆都无奈先撤了。
记忆力超强的david.turing记得的Topic包括:Hibernate,Spring,iBitas,Strut,SOA,BEA产品(Wls, Wlp, Liquid Data),JDK1.5,设计模式,泛型,数据库事务,Java控件,RichClient,XML,WebService,反编译技术,代码重构,比较.Net和Java在开发过程中的区别,UML,代码控制,反射机制,Oracle/SQLServer,手谈的AI设计,Web数据窃取...... 一群gay birds包括:Sparkle,Yok,WaterYe,江南白衣,Cyt,timiil,Char,Alex,瀚海,oo豆豆猪。
PS.英文不好的同学用词霸查一下gay bird,切勿自误。
作者:江南白衣
SpringSide--Pragmatic Enterprise Application KickStart and Common Library Stack,这么长的一个名字下来,不用解释大家都知道是做什么的了----以Spring Framework为core,提供一个Pragmatic的企业应用开发基础和最佳实践展示。
定位:为使用Spring框架的开发者提供一个非Demo版的复杂、正式而体现最佳使用实践的参照系统。
目标:囊括JavaEE必须面对的所有问题的合理的、合乎实践标准的解决方案,采用Plugins形式组织,使开发者可快速定位所需的参考方案并做加法到自己的系统。 项目网站:http://www.springside.org.cn or http://springside.sourceforge.net 1. Featrue List
-
Spring 2 - J2EE Framework.
-
Hibernate 3 - ORM, support EJB3/JPA1.0 in future.
-
Spring MVC /WebWork - Multi-Action Web framework.
-
JSP2.0 - View Template.
-
XFire - Web Service.
-
Acegi - Security, RBAC ana ACL.(doing)
-
Eclipse BIRT 2 - Report Engine.(doing)
-
Drools 3 - Business Rule engine.(doing)
-
ActiveMQ ,Jencks - JMS Message Driven POJO.
-
Quartz - Enterprise job scheduler.
-
DWR 2 , Prototype.js , TrimPath JSTemplate - Ajax
-
Compass - Search engine use Luecene .(doing)
-
Groovy - Dynamic script language.(doing)
-
Openi - BI web application for OLAP Report.(doing)
-
ServiceMix - ESB(Enterprise Service Bus) and JBI.(doing)
-
Commons Validator - client and server side validation.
-
SiteMesh web-page layout and decoration framework.
-
OSCache - Web cache solution.
-
ExtremeTable - JSP Tag Libraries.
-
Log4j - Logging tool.
-
Ant , Maven2 , JUnit, EasyMock - Build and Test tools.
- UTF-8 and I18N.
- Intergrate with Weblogic , Tomcat , JBoss , Geronimo.
- And we are choising the Workflow solution.
2. SpringSide与Appfuse有什么不同? 1.SpringSide较完整的演示了企业应用的各个主题,而Appfuse只有简单的登陆界面和用户管理。
2.SpringSide是深受Ruby on Rails影响的Pragmatic型的方案。
3.Appfuse主要目的是展示各式mvc、orm方案与Spring的结合,有些技术属于高手玩具,而SpringSide展示的是一个国内项目的实际形态,并带中文手册与大量中文代码注释
4. 脚本细节 SpringSide的基本结构是JDK1.4 + Spring 2.0 + hibernate3 + Spring MVC multi-action + JSP2.0。
使用 XFire提供WebService订书的服务端接口和 Java版/.Net版的客户端示范代码。
店员是个兼职的学生,所以系统会为每张订单发一封通知邮件给店员。为了不影响顾客下单的速度,发信的动作由jms异步进行。 系统还会用 Quartz定时扫描缺货的图书,用邮件通知店员。 老板只负责看一些色彩丰富,带图的报表。Eclipse Birt2.0提供日常报表 , Openi提供BI OLAP的。
基于Lucene的 Compass做的图书全文搜索。
基于 Drools规则引擎的订单满100元免运费,会员积分制等。
店面演示Ajax效果与 OSCache的Web Cache,SiteMesh的渲染效果使用。
一些非关键业务,用 Groovy动态语言来快速开发。
log4j系统将重要操作员日志异步写入数据库,使它们可管理。
综合的Acegi i安全权限管理。
utf-8, i18n的国际化项目。
ServiceMix ,WorkFlow的故事设计中。
5. RoadMap Road Map in JIRA Issue Checker ,欢迎大家提出更多Topic . 6. 团队成员列表 (排名按加入顺序) 欢迎朋友们加入。人多速度快是很重要的事情。
参加方式有3种 1.帮忙codereview提意见 2.到JIRA里面领任务 3.到JIRA 提出新任务
真正贡献了力量的同志自然会成为开发人员.
Team Worker: 江南白衣,cac,@_@,wuyu,charlse, efa,yimlin Contributor: water ye ,totodo,david.turing,pesome,oofrank 长老供奉: 庄表伟,Robbin
(排名按加入时间)
7. 交流区
演示站点
开发RoadMap
Spring中文论坛专区
团队开发日志
开发者QQ群:15690287 (only for Springside developer) 用户QQ群: 21601442
作者:江南白衣
Spring再强大,也要面对降临的问题--因为Spring不是Weblogic、Tomcat般的顶层容器,Servlet和EJB对象不由它创建,所以它必须要降临到Weblogic、Tomcat所在的位面。 初学者一般不用管那么多,照着Spring+hibernate+Struts之类的Sample就做了,但慢慢的,也许就要开始在jsp+javabean体系,土制框架,singleton类等环境下使用Spring了。 《Professional Java Development with the Spring Framework》第3章有"Managing the Containe"一节讲这个问题。一般可以分为直接召唤系与IoC fashion两类。
1.直接召唤系--Singleton的Application Context 最简单的,就像在UnitTest里那样,直接构造Application Context:
ApplicationContext ctx = new ClasspathXmlApplicationContext("ApplicationContext.xml"); 在Web环境里,会使用ContextLoader构造ApplicationContext后,压进Servlet Context。 由ContextLoaderListener或ContextLoaderServlet,在Web应用启动时完成。 然后在Jsp/Servelet中,可以通过Servlet Context取得ApplicationContext:
ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(application); 但像singleton类或者EJB中,就没有Servlet Context可用了。 如果全部像UnitTest那样直接构造,速度就会很不堪。自然的,就想到把ApplicationContext做成单例。 Spring提供了 ContextSingletonBeanFactoryLocator这样的物体。
先搞一个beanRefFactory.xml,里面写上所有的applcationContext-*.xml文件名,并把Context命名为"default-context":
<beans> <bean id="default-context" class="org.springframework.context.support.ClassPathXmlApplicationContext"> <constructor-arg> <list> <value>applicationContext.xml</value></list> </constructor-arg> </bean> </beans> 然后让loactor去找它,但代码有点长:
BeanFactoryReference bfr = DefaultLocatorFactory.getInstance().useBeanFactory("default-context"); BeanFactory factory = bfr.getFactory(); MyService myService = factory.getBean("myService"); bfr.release(); // now use myService 上面的代码实在是太灵活,太麻烦了。 还不如自己实现一个简单的Singleton,扩展ContextLoaderListener类,在Web系统启动时压入Singleton。
新的ContextLoaderListener类重载如下,ContextUtil中包含一个静态的ApplicationContext变量:
public void contextInitialized(ServletContextEvent event) { super.contextInitialized(event);
ServletContext context = event.getServletContext(); ApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(context); ContextUtil.setContext(ctx); } 用家可直接取用:
ApplicationContext context = ContextUtil.getContext(); 2.IoC fashion 如果所有地方都使用直接召唤系,那就反而是在打Rod的耳光了。因为他一直都反对代码与框架深耦合的。 所以,更好的方法是写一些glue code、base class来完成Spring的降临,而不让应用代码察觉Spring Application Context的存在。 不过,因为各个框架的结构不同,Rod也没办法讲出一个通用的整合方法,所以建议大家尽量学习已整合的各种框架,如Spring MVC、Struts的种种方式,写出自己的简单整合代码来。 只有不确定的调用某些Singleton类,不适合过早ioc的情况,可以使用直接召唤系。
作者: 江南白衣 每年的全球四大Java研讨会,它们的agenda,给大家提供了一个捉摸Java时尚风向的便利。 每年花几天看一遍它们的报道和share出来的slides,是CTO该做的事情。 PS. 如果你被邀在哪里做讲演,又想不到给下面那些似睡似醒的猪头说什么的,可以从中参考一二。 PS2.在迷宫一样的网站中翻滚了半个小时,把agenda和slides的链接都整理了出来,便人便己。 TheServerSide Symposium 对很多人来说,TheServerSide才是真正的Java官方社区-- 06年的agenda。 JavaPoils 欧洲最大的Java研讨会-- 05年报道, 04年完整Slides, 05年(1)pdf陆续补全中, 05年(2)pdf, 04年的talk (需简单注册)。 Java One 官方,官方.....-- 05年报道, 05,04年的ppt。 No Fluff Just Stuff tour 简称NFJS的大马戏团,最近的 Spring Experience也是和它一起搞的 -- 05年某次的报道, 过往的Agenda, Spearker的blog聚合。
作者:江南白衣
俗话说得好,没吃过猪肉不要紧,没见过猪跑路就很没面子了。新公司上班一周,主要就是看猪跑路,2005年末,一个典型的Java EE项目,场景是这样的:
1.一台内存强得变态的Sparc呼哧呼哧的在跑Oracle 10g。
2.它的一个兄弟,共享T3阵列,静静的跑vcs 为它做着双机热备份。
3.两台Weblogic 9做群集负责后台管理。 编程模式是最老土的struts+spring+hibernate,再蹭一点Ajax。
4.四台Weblogic 9做群集负责前台门户。 最直接的jsp + javabean,用weblogic的tag作了页面Cache。 weblogic还发布了一堆Web Service接口,也不时调用一下合作伙伴提供的WS。 最后还有一伙定时Task在奔跑,有些是自动改变帐单状态,有些是自动把数据导出,ftp到合作伙伴那。
5. 一台Crystal Reports XI 的报表服务器。 逻辑都用PL/SQL封装在SP和中间表里,设计报表时直接取用便是,不沾一丝Java代码的烟火。 PS. 这台也是唯一的Windows Server,
6. 还有一些跑Tomcat(省钱)的独立小应用,一些C写的任务,零散的分布在上面9台服务器的角落。
作者: 江南白衣 今天CSDN的头条是微软DSL 对决 UML,虽然不是什么新闻了,但还是很开心。因为我实在很不喜欢基于UML2.0的所谓MDA。 某人说,世界上没有无缘无故的爱,却有无缘无故的恨,尤其在网络上。 所以我很不喜欢UML三友。 因为( 非鱼批:不是说无缘无故么?) UML中除了Class图、顺序图、交互图,其他如部署图之类的,根本就是急就章,估计也就花了三友宝贵的十分钟设计出来的,也没多大用处。而Class图和顺序图,换作诸位看官,回家憋几天也能设计出个八九不离十的式样出来。就这么点东西,值得捧到高高的神坛上坐这么久不下来么? 第二不喜欢基于UML的MDA。UML作为沟通工具还好,但想用tagged value表达整个系统作为代码生成的依据,就像想拿XML来描述整个商业系统、商业逻辑一样。看这些年来,工具开发商浪费了这么多人月,除了实际帮了不少研究生的毕业论文外,再没多少成果了。(那些有限的生成效果,随便一个xml文件或者PowerDesigner放开手脚做一下也不差多少) 但就是这个三友和UML,把业界向更高一级语言迈进的希望死死绑在一辆战车上一绑就是好几年, 现在终于有一个出来搞局的了,而且还是手臂足够粗大的微软,就象Spring 搞了EJB2的局一样,怎不叫我这种蛮夷拍手叫好? 甚至不用管微软的设计最后是否成功(不过开发领域,微软还没有过完全失败的产品),只要把局搞乱,我就很高兴。何况,我也是个DSL爱好者。
作者: 江南白衣 昨天看J2EE 5规范的时候,八卦看了下如果自己要组装一个Application Server需符合的规范: EJB容器:
Enterprise JavaBeans (EJB) 3.0 (JSR-220)
Java Message Service (JMS) 1.1 Java Transaction API (JTA) 1.1 Java Authorization Service Provider Contract for Containers (JACC) 1.1 Java Platform, Enterprise Edition Management API 1.1 (JSR-77)Java Platform, Enterprise Edition Deployment API 1.2 Java EE Connector Architecture 1.5 Web:JavaServer Faces 1.2 (JSR-252)Servlet 2.5 JavaServer Pages (JSP) 2.1 Standard Tag Library for JavaServer Page (JSTL) 1.2 (JSR-52)Web Services:JavaAPI for XML Web Services (JAX-WS) 2.0 JavaArchitecture for XML Binding (JAXB) 2.0 (JSR-222)Web Services Metadata for the Java Platform 1.1 (JSR-181)Web Services for Java EE 1.2 (JSR-109)Java API for XML-based RPC (JAX-RPC) 1.1 SOAP with Attachments API for Java (SAAJ) 1.3 Java API for XML Registries (JAXR) 1.0 Other:JavaMail 1.4 JavaBeans Activation Framework 1.1 Streaming API for XML (StAX) 1.0 (JSR-173)
Common Annotations for the Java Platform 1.0 (JSR-250)Debugging Support for Other Languages (JSR-45) 再看 Geronimo的做法,不由觉得好好笑,它居然玩票式的组了一队开源软件来应付这些规范(不过止应付到J2EE1.4): 1. Tomcat/ Jetty ,应付了Web方面的Servlet 2.5 、JSP、JSTL。 2. Axis包了WebService方面的所有东西, Apache scout包JAXR。 3. OpenEJB 应付 EJB2.1,这是整个链条里最勉强的部分。另外它也准备EJB3的开发了。 4. ActiveMQ管JMS, MX4J管JMX, JOTM管事务, HOWL作事务日志。 5. WADI - a clustering, load-balancing and fail-over solution 具体请看 《 Geronimo!第 2 部分: 驯服 J2EE 1.4 这匹野马》 除了上述规范, Geronimo还整合了 Spring和支持JBI的 ServiceMix,一共用到了50多个开源项目,几乎把 Apache, CodeHaus上的项目一网打尽,伯乐过而北群空了。这样拉大旗建AppServer的方式,的确打破了某种市场状态,模糊了Application Server的界限,好好玩。 Geronimo这种疯狂整合靠的是它的GBean架构,具体看《 将第三方组件集成到 Geronimo 中》,而GBean之间的引用和交互,则靠 cglib生成的动态代理。有时间要具体学习一下这种全包容的架构,不知是先进还是落后。 PS . TSS 最近两天的三条消息1. Terracotta announces Clustered Spring Runtime --Terracotta 为Spring加入了集群能力。 2. JBoss adds Arjuna transaction engine -- Jboss整合了原来HP旗下BlueStone AppServer的事务技术,支持WebService事务。 3. jManage 1.0, JMX client, released-- 一个有Web版(这点比Mx4J好啊)和Console版的JMX client。 传统Applicaton Server供应商的日子越来越不好过了。
作者: 江南白衣 2005就这样完了, ONJava的年终总结: 2005 Year in Review。 TSS年初开会时讲得专家们自己都开始有点厌倦的EJB3,JSF1.2,Ajax,AOP的三宗合一,SOA和ESB,Groovy,还是没有一个stable的东西出来。 眼看2006,又是继续将这些话题变成产品的一年,让我们继续讨论厌烦: *Full stack Application Framework: Spring 2.0 Spring 2.0吹风会兼FB大会刚刚开过。夜观星象,Spring气数未尽,开源社区里也只它有资格不断整合别人。 另一个Stack名曰 RIFE,不过比较独。 另外,JBoss搜刮的JEMS (JBoss Enterprise Middleware)和JSF+EJB3的 Seam也会继续发音。 * Web Framework:JSF 1.2 最怕别人问现在开项目用哪个Framework好,选来选去暂时还是投靠标准好了。 不知道 Struts Ti, Struts Shale,Spring MVC的2006会怎样。 而Continuations这个名词明年也许会闪亮一下。 * Persist Framework: Hibernate 3.1 (EJB3/JPA1) 在 RoR的Active Record刺激下,annotaion 和default mapping终究要替代xml描述文件。 另外,除了麻烦的ORM,也很希望有一个极简的JDBC Framework,不知道JDBC4.0和Spring跑JDK1.5的SimpleJdbcTemplate什么样子。 *Web Service Framework:XFire (JAX-WS2.0、JAXB 2.0) SOA 风潮下的next-generation SOAP Framework,支持JavaEE 5的JAX-WS2.0、JAXB 2.0与annotation,还拖上了 Spring的手。 Axis的事实标准地位该不保了吧。 *JBI-ESB:ServiceMix
2006年的新大热名词--JBI(Java Business Intergrade)与ESB(Enterprise Service Bus)。 *Java Rule Engine与JDM 2.0:Drools Rule Engine和Data Mining 已经说了很久,不知道明年又如何。但Drools则演绎了一条标准的成名路: 1.先入CodeHaus再入Jboss 2.(号称)集成Spring 3. 提供Eclipse的插件 *动态语言嵌入:Groovy 期待在Ruby的不断刺激下,1.0正式版发布后的正式用家。 *some Ajax Framework Buffalo, Prototype, Dojo, MochiKit, DWR 混战之下总该有脱颖而出者吧? *AOP三宗归一 虽然大家还很少在应用中使用它,AOP在Spring 中的作用却非常明显。不知道Spring2.0是否可以三宗归一,给出一个框架设计时使用的简单方案。
作者: 江南白衣 今天的一条八卦,在Asp.net 2.0与 Rails系 RoR/ DJango/ Turbogears的两面夹击下,Java Web Framework的大佬们终于看到狼来了,坐下来,吃个包,开始商量合作。 消息在TSS主编 Dion Almaer的Blog上看到,再看这个 Java Web Alignment Group ,果然阵容鼎盛,36个Member,江湖上大部分大佬都到齐了。 Yahoo Group免费参观,不过他从2005.11.10号开始就已经没有贴子---歇菜了。
Framework |
Group Members |
Beehive |
Rich Feit |
AppFuse |
Matt Raible |
JavaServerFaces |
Ed Burns, Kito Mann, Craig McClanahan, Roger Kitain, Jacob Hookom, James Mitchell, Adam Winer |
MyFaces |
Bill Dudney, Ted Husted, James Mitchell, Travis Reeder |
Seam |
Gavin King, Jacob Hookom |
RIFE |
Geert Bevin, JR Boyens, Keith Lea |
Spring MVC and Web Flow |
Alef Arendsen, Keith Donald |
Stripes |
Tim Fennell |
Struts Classic |
Don Brown, Ted Husted, James Mitchell, Hubert Rabago, Niall Pemberton |
Struts Shale |
Craig McClanahan |
Struts Ti |
Don?, Rick?, Patrick?, James? |
WebWork |
Patrick Lightbody |
Wicket |
Eelco Hillenius | 上面的名单已成历史,唯一有趣的是Tapestry并不在列。 这个Group的最后成果就是Struts和Webwork上演了一出你的名字我的名字的 Struts Ti 。---"以Struts为名字,Webwork为核心,加上Beehive的annotataion和pageflow,再提升与JSF的集成能力"。可惜Spring MVC暂时不会加入,而JSF系如何合并还未知。最期待的,是它的Phase 2--zero congfig file。
作者:江南白衣
一年前,RIA新浪潮。 1.以新的Web控件代替复杂dhtml对控件的模拟; 2.以重返C/S的用户体验代替传统http的提交-返回模式,开发模式上甚至可以直接调用商业对象。 RIA一出现就尽获民心。但,Flex因为收费,XUL因为终端,XAML因为无期,OpenLaszlo因为出身与性能.......渐渐退出了大家的嘴边,他们也的确不争气,又一年过去了,都没再弄出大的声响。
这一年大家做什么呢,是忽然走红的ajax,来实现RIA中不刷新页面的承诺,还有高级如DWR,JSON-RPC,同样实现RIA中对商业对象的直接调用。 之前有ECHO2,而最近出现的一个框架叫ZK1,开发人员用XUL来开发,然后臂大力雄的框架会把XUL渲染成dhtml+ajax,算是一种有趣的思路。 但我还是觉得,浏览器应该升级,而不是靠复杂的dhtml+ajax来模拟,我是革命派,不是改良派,相对于全体民众花在模拟上的成本,浏览器的升级要简单得多。
前几天因为想在blog上弄点小花样,去了基于OpenLaszlo的blogbox。再回头,发现OpenLaszlo已经发布到3.1版本。
OpenLaszlo 3.1版本升级良多,已解决性能与中文问题。 *新版本可以编译为Flash 6、7、8的格式,性能上突飞猛进,不再是以前吃资源的巨怪。 *支持Unicode,支持中文了。 *支持SOLO deploy了,也就是不再要求Servlet Container,也可以deploy到IIS和Apache。 其他还有Drawing API,Charting Components,Dynamic Libraries,Ajax API等一系列升级。
OpenLaszlo3.1的编程体验 1.不愧曾是.com的产物,在Windows 下点了两下next就装完了,而且已有了整套的开发环境,10秒钟之后,我开始在my-apps目录写我的helloworld.lzx,然后刷新页面看结果。 2.XML格式的控件定义,JavaScript作为脚本语言,再加上完备的tutorial、reference文档和demo code,又和wxWidgets那样,基本上没什么特别要学的东西,直接可以开始编码了。
3.为什么RIA要比模拟RIA要好? 开篇两点之外,OpenLaszlo还可以自由定义控件的layout,比用table、div的做法自由。 另外,OpenLaszlo还可以简单的利用现有控件,定义新的控件和式样。
对OpenLaszlo有不满意吗? 有阿,用户社群太少。还有控件的默认式样也比Flex的差一截,虽说可以自己customize,但不是每个人都那么有空的呀。还有那个IBM友情客串的IDE,啥时候才弄得像个样嘛。
Flex ,XUL又在做什么? Flex2 摆出的阵仗显然胜于OpenLaszlo: Flex Framework 2, Flex Builder 2,Flex Enterprise Services 2,Flex Charting Components 2 但,公无收费,公竟收费,&*(^%,当奈公何。
XUL呢,新出的Firefox1.5只是Firefox1.0的补完,看不出FF2.0的痕迹,一年了。
作者: 江南白衣 反射、Proxy和元数据是Java最强的三个特征,再加上 CGLib (Code Generation Library)和ASM,使得Java虽然没有Ruby,Python般后生可畏,一样能做出强悍的框架。 Proxy可以看作是微型的AOP,明白提供了在继承和委托之外的第三个代码封装途径,只要有足够的想象力,可以做得非常好玩,Spring的源码里用Proxy就用得很随便,看得我非常眼红。可惜Proxy必须基于接口。因此Spring的做法,基于接口的用proxy,否则就用cglib。AOP么,一般小事非compoent一级的就不麻烦AspectJ出手了。 cglib的Enhancer说起来神奇,用起来一页纸不到就讲完了。 它的原理就是用Enhancer生成一个原有类的子类,并且设置好callback到proxy, 则原有类的每个方法调用都会转为调用实现了MethodInterceptor接口的proxy的intercept() 函数: public Object intercept(Object o,Method method,Object[] args,MethodProxy proxy) 在intercept()函数里,你可以在执行Object result=proxy.invokeSuper(o,args);来执行原有函数,在执行前后加入自己的东西,改变它的参数值,也可以瞒天过海,完全干别的。说白了,就是AOP中的around advice。 AOP没有出现以前,该领域经典的设计模式是Decorator,像Java IO Stream的设计就是如此.不过,如果为每个DAO, 每个方法的写Decorator函数会写死人的,所以用上cglib的好处是一次过拦截所有方法。
另外,cglib除了Enhancer之外,还有BulkBean和Transform,都是Hibernate持久化的基础,但文档贫乏,一时还没去看怎么用。
1.AOP里讲了一百遍阿一百遍的log aspect在cglib是这样做的:
public class LogDAOProxy implements MethodInterceptor { private Logger log=Logger.getLogger(LogDAOProxy.class); private Enhancer enhancer=new Enhancer(); //返回DAO的子类 public Object getDAO(Class clz) { enhancer.setSuperclass(clz); enhancer.setCallback(this); return enhancer.create(); } //默认的拦截方法 public Object intercept(Object o,Method method,Object[] args,MethodProxy proxy) throws Throwable { log.info("调用日志方法"+method.getName()); Object result=proxy.invokeSuper(o,args); return result; } }
应用的代码: LogDAOProxy proxy = new LogDAOProxy(); GoodsDAO dao = (GoodsDAO)proxy.getDAO(GoodsDAO.class); dao.insert(goods); 2.而在Spring的管理下应该略加修改的高级Decorator
上面的例子用 return enhancer.create();创建子类实例,但在Spring管理下,一些Bean的实例必须由Spring来创建和管理,而不由enhancer来创建的。所以我对上述用法略加修改,使它真正当一个Proxy的角色,请对比黑体字的部分
public class LogDAOProxy implements MethodInterceptor { private Logger log=Logger.getLogger(LogDAOProxy.class); private Object dao=null; private Enhancer enhancer=new Enhancer(); //返回DAO的子类 public Object getDAO(Class clz,Object dao) { this.dao = dao; enhancer.setSuperclass(clz); enhancer.setCallback(this); return enhancer.create(); } //默认的拦截方法 public Object intercept(Object o,Method method,Object[] args,MethodProxy proxy) throws Throwable { log.info("调用日志方法"+method.getName()); Object result=proxy.invoke(dao, args); return result; } } 可见,原来模式里在getDao()时由enhancer创建dao,而 调用intercept时则将enhancer创建的dao以Object o参数传回。 而新模式里,dao在getDao()时从外面传入,enhancer.create()返回的是一个proxy. 而调用intercept时,实际会用之前传入的dao进行操作,而忽略Object o参数传入的proxy. 有点遗憾, intercept函数里MethodProxy的Signature是固定的 , 即客户如果调用foo(String),你不可以用proxy.invoke偷换成foo(String,String); 系列文章: Java下的框架编写(1)--序Java下的框架编程(2)-对泛型的无聊用法和为擦拭法站台 Java下的框架编程(3)--关于反射的碎话 Java下的框架编程(4)--Annotation vs XML vs Interface 最新一Round Java下的框架编程(5)--cglib应用Java下的框架编程(6)--asm(待写)
作者: 江南白衣 1.因为两者的用途不同,所以Annotation与XML应该并存
Anootation vs XML 到了现在,在Spring和EJB3各占一边的持续演示下,各自的用途已清晰。 虽然两者之间完全可以相互替代,没有绝对不能做的事情,但却存在好不好的问题,两者的用途不同,应该并用: "size=10,db_user=ito"这样的参数,仍然适合放在XML,YAML(ruby),properties,ini文件里。 而Annotation中所放,是真正程序的一部分,是旧编程体系中所缺的那一块东西。 看看编程语言的发展: 一开始只是函数的封装; 到了OO语言,对象有了自己的属性和方法; 到了框架满天飞的年代,这些属性和方法又有了自己的属性,来告诉框架如何为自己提供服务。比如Spring和EJB3,POJO就用配置信息来告诉框架无侵入的提供服务。整个进化的过程非常自然。 因为这些信息本来就是程序的一部分,所以应该仍然放在Code里头,Spring把它割裂到XML明显影响了代码的阅读。 2.Anotation/XML PK Interface,Spring 无侵入性的基础 切尔斯基的Blog讲了Annotation/XML 对Interface的PK。这次PK,也可以认为是Spring 对 EJB2.1在框架无侵入性上的一次PK。 在EJB2.1时代,POJO必须通过接口来向框架声明一些东西,这就造成了框架的侵入性,强迫POJO实现一堆接口。而Spring,把这些元信息搬到了XML配置文件。 在Spring里随便就可以举个例子。比如一个POJO,在Spring为它进行依赖注入A和B后,需要根据A和B来装配一个内部属性C,这样就需要再跑一个init()函数。Spring提供两种方式,一种侵入性的,实现InitializingBean接口的afterPropertiesSet()函数供Spring调用。 而另一种是无侵入性的,在Bean的xml节点里面自行定义init函数的名字。 3.Annotation目前的弱点
一是Hibernate、Struts、三姑妈、四姨婆的annotation如果一股脑儿的全堆在可怜的POJO上很没人道,如果三姑六婆都抢Transation这个Anontation就更惨了。 二是annoation的表达能力有限,不如XML的强。 4.JSR250 - Common Annotations for the Java Final Draft已经发布,八卦回来一看,也只是多定义了几个Common Annotation而已。 1.Generated 自动生成的代码要用此声明,而且必须说明工具的名称,如@Generated(“com.sun.xml.rpc.AProcessor”) 2. Resource/Resources 就是EJB3里面用的资源引用。 3.PostConstruct / PreDestroy 声明那些如题的函数。 还有一些安全方面的annotation,不关心。 文章:Java下的框架编写(1)--序Java下的框架编程(2)-对泛型的无聊用法和为擦拭法站台 Java下的框架编程(3)--关于反射的碎话 Java下的框架编程(4)--Annotation vs XML vs Interface 最新一Round Java下的框架编程(5)--cglib应用Java下的框架编程(6)--asm(待写)
作者: 江南白衣 不知道明年今日,会不会出现一队只会用Ruby On Rails的毕业生,像当年的asp、jsp、php迅速剿了C++/perl的CGI那样,把我们给剿了。同好们劝我,根据大公司经济学,这基本不会发生。 在茫茫的框架之海认出一个Rails框架,基本上靠四个特征 1.一门动态语言 2.一个extreme simple to use的ORM框架 3.一个extreme simple to use的MVC框架 4.一些自动生成代码的命令、模版 其余ajax、web service、i18n等特性自由扩展 1.Ruby: Ruby on Rails Rails系的旗手,一己之力搞得J2EE阵营鸡飞蛋打。 旗手的作用表现在: *最接近1.0的版本,目前已出到最后一个RC版 1.0 rc4(0.14.3) *拥有一本amazon超级畅销的《Agile Web Development with Rails》,而且这本书的组织也好,part I是一个渐进的sample application 让你快速入门,partII是几个重要领域的深入介绍。 *拥有自己的IDE: RadRails ,基于Eclipse但独立成军,目前出到0.5。(是不是怕惨了Eclipse的多变,现在这些IDE的发行版本开始反包含了Eclipse在内。) 2.Python: DJango、turbogears 认识不深,所以 DJango请看 limodou的blog, turbogears看 xlp123的。 3.Groovy: grails 如果能顺产,绝对是J2EE阵营里感情分最高涨的项目。因为它语言用Groovy,ORM用annotation版Hibernate,MVC用Spring。不用担心它换汤不换药,因为经过extreme的封装,再结合Groovy,绝对不再是原来的Spring+Hibernate,而是和RoR差不多的一样东西了。不信可以看看他的Sample。 不过这个项目的源码目录树非一般的乱,也还没有0.1版释出。还有一样奇怪的事情,这个Groovy项目,大多数的class代码都是Java写的。 4.Php: symfony ,cake 据说 cake比 symfony弱非常多,所以没看。 symfonys是基于php5的项目,成功整合了 Propel(ORM)、 Mojavi3(MVC),再配合自动生成的脚本打造而成。看他的sample,最后整合出来的东西也很Rails了,除了ORM层的xml文件。 还有一个发现是Php项目现在可以用pear来安装,很像Ruby的gem,Java的Maven要努力了。
C:/>pear channel-discover pear.symfony-project.com C:/>pear install symfony/symfony 这样就装完了symfonys和propel&croel, mojavi3,还有用来运行脚本命令的pake(php make),PHing(php ant?),一大堆东西。
佩服 david turing,独自张罗了 BEA广州User Group这台一百二十人的大戏。 如果有什么意见,就是这一百二十对目光,太严肃了。所以今天能顶住这么多眼镜反射,站到讲台上的都是好兄弟(姊妹)。 而我期望的UG有一种更relex的style,一面喝酒一面听歌一面看日落,超过千人鸦雀无声的呆望咸蛋黄般的落日悄然没入大海,当最后的阳光消失时,全场千人竟然一齐拍手喝彩,有如目击欧洲杯黄金入球,场面好鬼"娘"...... 很明显,刚才说的是Cafe del Mar。转回现场实况报道:今天群里出现了cyt、rayman、pqf、ytam、GTM、小小强、yok、sparkle、瀚海、翱翔和我,刚好够一桌。 讲演报道 去得比较晚,没看到Bea工程师的讲演。看到身为Promgrammer粉粉团家嫂的shallon讲Spring(由于彭羚同学惯称商台家嫂,所以cyt偶像的shallon亲爱也可称为...照片在 dev2dev),讲稿是一份非常Professional的内部培训材料,力挺之下,被david.turing误报为too simple,特此勘误:( 另一位是Hongsoft同志,不过隔行与隔山,工作流方面完全不懂,ppt上都是一堆不认识的名词,遂十分钦佩之(如果你在演讲过程中不要老点我名字我会更钦佩你,下次轮到我讲的时候,嘿嘿....),并理解为是在讲软件命名风水学,哪个旺,哪个不旺,最后是BPEL胜出。(但cyt偶像隔完又隔了几行之后,仍然觉得像是为了兼顾到场领导的科普教育,too simple,这就是当偶像的资本) 全场笑位 全场最大的笑位hongsoft刚上来,很谦虚的讲,“本来想趁刚才的时间复习一下讲稿的,但因为前面的演讲太精彩,所以我... ” ,“睡着了...” ytam忽然接了一句。方圆几米内笑倒一片。这个故事告诉我们,当下面有ytam这么恐怖的存在时,有话一定要一次说完。 其余八卦 茶会开始的时候,GTM说,明白为什么有的同志坐到山顶了,原来那里才是上菜位。我们这些坐一二排握手位的反而......于是一帮人又接着去澳门街FB,而且消灭的速度一流。 还有,因为GTM上次偷拍的失手,今天大家看到GTM的手机都像见到鬼似的..... 还还有,今天cyt偶像拿到了ytam那本绝版的《C++ Template Complete Guide》 中文版,我也想要阿。以后大家可以多点利用聚会的机会交换东西。
作者: 江南白衣 充分体验到知识循环再用的好处,原本对 Python、 wxWidgets没有接触的,天黑天亮之间,已经作了一个半成品的桌面程序出来。 1.选型 通常选型之后,都会迫切的告诉别人自认为正确的原因,这时候路过的人就比较不幸了。 我选Python和wxWidgets,是因为....... 因为是发布到网上的小程序,要它很小,Java和.Net这两个还算当红但要装虚拟机的笨家伙最先out了,而Python在 py2exe之后压成rar才3M,如果有心思还可以弄得更小。 选 wxWidgets是因为它可以通行于Windows,Linux两个位面,另外 Fox也能通用,不过wxWidgets是像SWT一样用Native Widgets的,在WinXP上比较好看。 用Python而不是C++,是为了快速开发。当然,心底里其实是贪好玩。本来喜欢Ruby的语法更纯洁一些,可惜 wxRuby已经太久没更新了。 2.wxWidgets 所谓GUI框架,万变不离下面几点: 1.框架结构 拿个HelloWorld一看就懂,又是Application->Frame->Menu 的标准架构。 2.wxWidgets用法 来来去去还是Text框,选择框,按钮几个老面孔,在 wxPython上把wxPython2.6-win32-docs-demos-2.6.1.0.exe档下载回来,就有C++版本的API手册与python版本的每个widgets的Demo Code。 3.控件与页面的Layout 一种方式是C# Winform和Swing那样在程序里生成组件和layout,经历过SWT手写代码画页面的折磨,再看到一层又一层的Container代码(wxWidgets里是Sizer)已经不觉得麻烦了。也有所见即所得的工具如 BOA,不过毕竟没有Visual Studio for WinForm那么好,难以真正使用。 一种是像Delphi, VC或未来的XAML那样把控件和layout记在XML文件里。但我没有用。 4.事件分发机制 像 EVT_BUTTON(self,ID_UPLOAD, self.onUpload)这样的代码,挺简单的。 可见,只要有过GUI编程的经验,再学wxWidgets 很容易。 参考书:《Cross-Platform GUI Programming with wxWidgets》 《wxPython in Action》 3. Python 手边放一本Python的参考书,只要对动态语言有点感性认识,对着Sample Code能能猜就猜,猜不到就拿chm版的参考书来索引,也很容易入门。 最难的地方发生在遍历目录,那时候已经有点困了:
for root, dirs, files in os.walk('C:/projects/'): print sum(getsize(join(root, name)) for name in files) 这是什么见鬼语法阿!! 原来os.walk('C:/projects") 的返回值是一个tuple。在 C++ Boost库中接触过这个概念,平常函数都只能返回一个值,而tuple可以让你返回多个(这样就不用利用传址的参数来返回啦),所以就有了for root,dir,files in os.walk()这样的句子。 还有 print join(root,name) for name in files,原来python还有这种把闭包写在for的前面的简写法。 IDE最后还是用了Eclipse的插件 PyDev,毕竟Eclipse看着比较舒服,其他编辑器做得那么难看,怎么还好意思收钱。 4.美化界面 因为wxWidgets用的是native widgets,不像Delphi,C# 和Swing有专门的look and feel 美化控件,所以美化的主要方式是为Toolbar和Button配上好看的图标,还有修饰整个软件的配色。 推荐Tango一个图标库: http://tango-project.org/ to make open source software beautiful...说出了我的心声啊,"顶尖儿的程序员必有完美主义艺术家之倾向。",目前的图标还不多,迅速更新中。
作者:江南白衣
记者:你最讨厌记者问什么问题? 黄伟文:嗯,那些问题里面带最字的.....
所以,题目里面那个"最"字可以完全忽略不计,本文是用来记录那些自己喜欢,但名声没有Spring、Hibernate般响亮的项目:
Xfire:http://xfire.codehaus.org Next-generation SOAP Framework,使用Stax,支持JavaEE 5一系列最新标准,支持各种Binding和自己最简单的Aegis Binding,还拖上了Spring的手做到非常简单的发布。Axis的事实标准地位该不保了吧。
Grails: http://grails.codehaus.org Groovy On Rails,底层使用封装过的Hibernate和Spring,Javaer们最最亲切的Rails--见 各系Rails大点兵
Drools:
http://labs.jboss.com/portal/jbossrules
开源规则引擎里最好的了,虽然比不上死要钱的ILog。但加入了JBoss阵营已经很强悍,有IDE,有很流氓的DSL写法,语法也已非常贴近ILog. 找个好靠山,支持Spring,增加IDE Plug-in,这几乎成了每个开源方案的成名之路。
ExtremeTable: http://www.extremecomponents.org DisplayTag 的Killer。没想到TagLib日渐式微的时候,还有Extreme Table这么设计优良,身光颈靓的尤物 new born,实在鼓舞人心。目前的功能已经强了DisplayTag好多个马位,但站长依然雄心勃勃的继续着RoadMap。
Pentaho: www.pentaho.org 商业智能方案,最核心还是基于Mondrain+JProvit的经典穷人OLAP通用方案,但在整个流程和工具上花了很多功夫。 Compass: http://www.compassframework.org/ 基于已成事实标准的Lucene,又和Spring,Hibernate搞在一起的全文搜索方案,是集成方案,not only 引擎。
Daffodil Replicator: http://www.daffodildb.com/replicator/ 通用的多数据库synchronization方案,能够通过配置策略解决数据库异构和数据冲突。
LifeType: http://www.lifetype.net/ php的成熟多用户Blog应用,原名Plog,有着很好的插件机制,对php的OO、模板、adodb应用都非常成熟,是个学习php应用的蓝本。Javaer整天忙着换框架,根本没时间沉淀出这样成熟的应用。
Joomla: http://www.joomla.org/ php的CMS 方案 Mambo的开源分裂版,基础的MVC架构比XOOPS弱,但长得好看就是她的资本。
随时更新中.....
反射,所有教科书都正儿八经的讲了,这里只能再随便讲两句。 反射是一种让框架能够根据 "以字符串形式存在的信息" 来调用对象的属性和函数的技术,是Java对C++最大的进步之一---让框架编程真正走向平民化。MFC年代,无论侯捷如何深入浅出,还在念大学的我就是搞不懂那些注册"消息--函数映射"的魔法宏。 不过Java的反射也就是对着C++比较自豪而以,因为C#,Ruby,Python甚至php都标配了反射的功能。而且,人家的反射语法都是内嵌在基础Object类的,拿最弱的php来看:
$func_name="helloworld"; $foo->$func_name; 而Java,却搞出了Class,Methed, Field,Constructor这么一大堆类出来。本来这是Java设计师很严谨,很cool的体现,问题是它居然不提供一种集成的简便的写法......相同的情形还出现在Java的I/O 类库里。 微软这方面就做得好些,懂得讨好开发人员。 因为Java的无情,就搞得大家的项目里要自制BeanUtils了。幸亏 Apache Jakarta Commons 已经做了一个比较好的,可以直接使用-- 以前写的介绍文章。 另外Spring也做了一个。 闲得没事做的,还可以emule一本〈Relection in action〉回来看。 而C++下面的"反射",见 我偶像di文章。另还有一个比较BT的C++框架叫 ACDK的,把自己整得和Java很像,有反射和垃圾收集,甚至和JSDK差不多的线程,Unicode,I/O,网络,XML API。可惜的是,即使到了C++0x, B大叔还是不准备在语言级支持反射。 系列文章: Java下的框架编写(1)--序Java下的框架编程(2)-对泛型的无聊用法和为擦拭法站台 Java下的框架编程(3)--关于反射的碎话 Java下的框架编程(4)--Annotation vs XML vs Interface 最新一Round Java下的框架编程(5)--cglib应用Java下的框架编程(6)--asm(待写)
作者:江南白衣 从8i到10g,Oracle不断进化自己的SQL Tuning智能,一些秘籍级的优化口诀已经失效。 但我喜欢失效,不用记口诀,操个Toad for Oracle Xpert ,按照大方向舒舒服服的调优才是爱做的事情。
1.Excution Plan Excution Plan是最基本的调优概念,不管你的调优吹得如何天花乱堕,结果还是要由Excution plan来显示Oracle 最终用什么索引、按什么顺序连接各表,Full Table Scan还是Access by Rowid Index,瓶颈在什么地方。如果没有它的指导,一切调优都是蒙的。
2.Toad for Oracle Xpert 用它来调优在真的好舒服。Quest 吞并了Lecco后,将它整合到了Toad 的SQL Tunning里面:最清晰的执行计划显示,自动生成N条等价SQL、给出优化建议,不同SQL执行计划的对比,还有实际执行的逻辑读、物理读数据等等一目了然。
3.索引 大部分的性能问题其实都是索引应用的问题,Where子句、Order By、Group By 都要用到索引。 一般开发人员认为将索引建全了就可以下班回家了,实则还有颇多的思量和陷阱。
3.1 索引列上不要进行计算 这是最最普遍的失效陷阱,比如where trunc(order_date)=trunc(sysdate), i+2>4。索引失效的原因也简单,索引是针对原值建的二叉树,你将列值*3/4+2折腾一番后,原来的二叉树当然就用不上了。解决的方法: 1. 换成等价语法,比如trunc(order_date) 换成
where order_date>trunc(sysdate)-1 and order_date<trunc(sysdate)+1
2. 特别为计算建立函数索引
create index I_XXXX on shop_order(trunc(order_date))
3. 将计算从等号左边移到右边 这是针对某些无心之失的纠正,把a*2>4 改为a>4/2;把TO_CHAR(zip) = '94002' 改为zip = TO_NUMBER('94002');
3.2 CBO与索引选择性 建了索引也不一定会被Oracle用的,就像个挑食的孩子。基于成本的优化器(CBO, Cost-Based Optimizer),会先看看表的大小,还有索引的重复度,再决定用还是不用。表中有100 条记录而其中有80 个不重复的索引键值. 这个索引的选择性就是80/100 = 0.8,留意Toad里显示索引的Selective和Cardinailty。实在不听话时,就要用hints来调教。 另外,where语句存在多条索引可用时,只会选择其中一条。所以索引也不是越多越好:)
3.3 索引重建 传说中数据更新频繁导致有20%的碎片时,Oracle就会放弃这个索引。宁可信其有之下,应该时常alter index <INDEXNAME> rebuild一下。
3.4 其他要注意的地方 不要使用Not,如goods_no != 2,要改为
where goods_no>2 or goods_no<2
不要使用is null , 如WHERE DEPT_CODE IS NOT NULL 要改为
WHERE DEPT_CODE >=0;
3.5 select 的列如果全是索引列时 又如果没有where 条件,或者where条件全部是索引列时,Oracle 将直接从索引里获取数据而不去读真实的数据表,这样子理论上会快很多,比如
select order_no,order_time from shop_order where shop_no=4
当order_no,order_time,shop_no 这三列全为索引列时,你将看到一个和平时完全不同的执行计划。
3.6 位图索引 传说中当数据值较少,比如某些表示分类、状态的列,应该建位图索引而不是普通的二叉树索引,否则效率低下。不过看执行计划,这些位图索引鲜有被Oracle临幸的。
4.减少查询往返和查询的表 这也是很简单的大道理,程序与Oracle交互的成本极高,所以一个查询能完成的不要分开两次查,如果一个循环执行1万条查询的,怎么都快不到哪里去了。
4.1 封装PL/SQL存储过程 最高级的做法是把循环的操作封装到PL/SQL写的存储过程里,因为存储过程都在服务端执行,所以没有数据往返的消耗。
4.2 封装PL/SQL内部函数 有机会,将一些查询封装到函数里,而在普通SQL里使用这些函数,同样是很有效的优化。
4.3 Decode/Case 但存储过程也麻烦,所以有case/decode把几条条件基本相同的重复查询合并为一条的用法:
SELECT COUNT(CASE WHEN price < 13 THEN 1 ELSE null END) low, COUNT(CASE WHEN price BETWEEN 13 AND 15 THEN 1 ELSE null END) med, COUNT(CASE WHEN price > 15 THEN 1 ELSE null END) high FROM products;
4.4 一种Where/Update语法
SELECT TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER) = (( SELECT TAB_NAME,DB_VER) FROM TAB_COLUMNS WHERE VERSION = 604)
UPDATE EMP SET (EMP_CAT, SAL_RANGE) = (SELECT MAX(CATEGORY)FROM EMP_CATEGORIES)
5.其他优化 5.1RowID和ROWNUM 连Hibernate 新版也支持ROWID了,证明它非常有用。比如号称删除重复数据的最快写法:
DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID) FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
6.终极秘技 - Hints 这是Oracle DBA的玩具,也是终极武器,比如Oracle在CBO,RBO中所做的选择总不合自己心水时,可以用它来强力调教一下Oracle,结果经常让人喜出望外。 如果开发人员没那么多时间来专门学习它,可以依靠Toad SQL opmitzer 来自动生成这些提示,然后对比一下各种提示的实际效果。不过随着10g智能的进化,hints的惊喜少了。
7. 找出要优化的Top SQL 磨了这么久的枪,如果找不到敌人是件郁闷的事情。 幸亏10g这方面做得非常好。进入Web管理界面,就能看到当前或者任意一天的SQL列表,按性能排序。 有了它,SQL Trace和TKPROF都可以不用了。
|
|
公告
常用链接
随笔分类
随笔档案
朋友
积分与排名
最新评论
阅读排行榜
|
|