加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-14 17:02:10 所属栏目:大数据 来源:网络整理
导读:??? 作者: 江南白衣 ? ??? 前篇:〈在Spring+Hibernate框架下,用动态语言写业务类〉讲述在Spring+Hibernate的架构下,因为动态语言所带来的利益,把一部分业务类改用Groovy编写并编译成Java Class文件。 ??? 而且,因为Groovy的强大与简便,加上与Java亲密

??? 作者:江南白衣?

??? 前篇:〈在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>D</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)??? }}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读