Groovy写业务类、框架类的那一吨好处

本文探讨了如何在Spring+Hibernate框架中利用Groovy动态语言的优势来编写业务类和部分框架类,通过具体示例展示了Groovy的便利性和强大功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2005年06月30日 16:30:00

作者:江南白衣

前篇:〈在Spring+Hibernate框架下,用动态语言写业务类〉讲述在Spring+Hibernate的架构下,因为动态语言所带来的利益,把一部分业务类改用Groovy编写并编译成Java Class文件。
而且,因为Groovy的强大与简便,加上与Java亲密无间的关系,一些框架类也可以逐渐考虑用Groovy编写。


1.虽然多是星零的好处,但忽然间一整吨好处摆在面前还是很让人感动的。

除了动态语言和闭包、MOP,Groovy其他的特性多是对J2SE中设计不合理的地方逐一进行修正,集合、IO、字符串操作......虽然多是星零的好处,但忽然间以整吨好处摆在面前还是挺让人感动的。

同时,Groovy完全兼容Java语法,但又提供糖糖选择的方式感觉很贴心。(Groovy唯一不支持的java语法就是Inner Class的定义和函数定义里的"throws Exception" , 私生子的好处啊)

隐约觉得因为动态语言的无类型,还有闭包这样带着Lisp式FP的印记,加上MOP这样的机制,可能会激发更大的变革发生。

1.动态类型
动态类型在Framework型项目中非常重要,多少设计模式呕心沥血,就是为了和这个类型搏斗。
而且,如果你是把代码编译成java Class,健壮性不会减低太多。

2.闭包
fp的基础,没有闭包的C++用函数指针,java用匿名内部类,都比他差远了。
详看Matin Flower >闭包 <文章的中文版> ,在一段文件操作的Script中试演了一下,果然使代码简洁了好些。

3. MOP
Groovy的Team Leader-- Guillaume Laforge最喜欢的一样特性,groovy 嵌入式XML语法的基础,对属性和方法访问的intercept 机制。详看另一篇blog
又比如,在MOP下,DAO那一堆findByName,findByTitle不用再逐一实现了,实现一个findBy即可拦截其他子虚乌有的findByXXX。

4.强大的String类
a.可以直接在String中嵌入EL, "orderBy ${sortColumn}",省了好多"和+号。
b.hql 可以多行,不用写N多"和+ , 写sql时特别方便。
c.简单集成了正则表达式
If ("name"==~ "na.*")
{println "match!"}

5. 集合与循环的语法
for (car in cars) { println car }
for ( e in map ) { x += e.value}

或者
car.each{print it}

集合也可以直接定义了,如
def myList = ["Rod", 3, Date()]
def myMap = ["Neeta":31, "Eric":34]

6.为JDK的基础类扩展了一系列Helper方法
//原来StringTokenizer类的功能被简单的集成到String类中了
names.tokenize(",").each{......}
其他基础类的扩展见Groovy-JDK

7.简化的Bean定义与赋值

  //自动生成Getter和Setter
class Customer
{
Integer id;
String name;
}
//简便的对象赋值
customer = new Customer(id:1, name:"calvin");
customer2 = new CUstomer(id:2);
重新使对象的属性public,对java滥用getter,setter是一种修正。

8. Object内建的反射语法
customer.getAt("name") //得到属性name,
customer.invokeMethod("someFunction") //调用方法someFunction
从此不再需要Apache BeanUtils。

9.GPath--内置的XML语法,和Fremarker类似。
传说中JDK7.0的功能 jdom和Dom4j可以安息了

   book = new XmlSlurper().parseText(">book writer='calvin'<>title
  
   /title<>/book<
   ")
   
println book.title;
println book[@writer];
println book.children().size();

10.运算符重载
//向数组添加对象
params >> customer.getAt(it);

还有如C++的向String,InputStream添加对象.
还有集合类相加,如list1+list2

11.简化了IO操作

12
.省略了每行末尾的分号
既然每行都要的,何必多此一举呢?
另外return语句也可以省略,不过我还是习惯写:)

2.Groovy版CustomerDAO的示例:

package com.itorgan.myappfuse.dao;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
public class CustomerDAOGroovy extends HibernateDaoSupport
{
public insert(customer)
{
getHibernateTemplate().save(customer)
}

public List getAllValid(sortColumn)
{
def hql = """from Customer customer
where customer.status='valid'
order by ${sortColumn}"""
def query = getSession().createQuery(hql)
return query.list()
}

public boolean isUnique(customer, uniqueColumnNames)
{
def params = []
def hql = "select count(*) from Customer customer where "
def first = true
uniqueColumnNames.tokenize(",").each
{
if (!first)
hql += " or "
else
first = false
hql+="customer.${it}=?"

params >> customer.getAt(it)
}
def result = getHibernateTemplate().find(hql,params.toArray())
return ( result.get(0) == 0)
}
}



Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=408645


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值