- 浏览: 5176327 次
- 性别:
- 来自: 天津
博客专栏
-
实战 Groovy
浏览量:29446
文章分类
- 全部博客 (639)
- 代码之谜 (6)
- JavaScript quirks (5)
- 程序员 (92)
- Java (93)
- BT编程 (7)
- html/css (64)
- Groovy&Grails (42)
- Android (20)
- C/C++ (5)
- PHP/Perl/Python (46)
- 经典文章 (51)
- CodeIgniter (14)
- JQuery (10)
- 笑话 (4)
- 其他 (32)
- javascript (69)
- 云计算 (0)
- html5 (7)
- 面试 (8)
- google (3)
- nosql (2)
- nodejs (11)
- go (5)
- erlang (1)
- 小常识 (3)
- 冷知识 (5)
- database (4)
- web (12)
- 架构 (12)
- Exception (0)
最新评论
-
jqw1992:
https://www.chromefor.com/libra ...
[福利] 开发者必备的 Chrome 插件——ChromeSnifferPlus -
litjerk:
初步算了一下,目前最最精简的Win98版是5M,他5个小时多敲 ...
让人目瞪口呆的三位世界级电脑大师 -
379855529:
。。似乎重点没说NIO啊,前面基础只是铺垫的很好的,可是我要的 ...
Java NIO与IO的详细区别(通俗篇) -
springmvc_springjpa:
spring mvc demo教程源代码下载,地址:http: ...
一步步开发 Spring MVC 应用 -
匡建武:
Good
四个程序员的一天
Service 层
除了 Web 层 之外, Grails 还定义了service 层的概念。Grails 团队不赞成在controllers中嵌入核心的应用程序逻辑,因为这样并没有提升重用和清楚的关注点分离。
Grails中的Services在应用程序中被视为放置多数逻辑的地方 。从controllers脱离,负责处理通过重定向的请求流等等。
创建Service
你可以在终端窗口的项目根目录下运行 create-service 创建Service:
grails create-service simple
上面的示例将在grails-app/services/SimpleService.groovy
位置创建一个Service。
service的名字按规约以 Service
结尾。除此之外,service就是个普通的Groovy类:
class SimpleService { }
1 声明式事务处理
Services一般涉及协调 domain 类之间的逻辑, , 因此常常涉及大范围的持久化操作。因为services性质,它们常常需要事物状态。你可以使用 withTransaction方法来编程事物,不过,这是重复性的,没有充分利用Spring强大的潜在事物抽象
Services允许启用事物,本质上是以声明的方式来声明service中的所有方法必须用于事物。默认情况下,所有services的事物都是可用的——禁用它,只需设置
transactional
属性为 false
:
class CountryService { static transactional = false }
你也可以默认设置这个属性为 true
在以后改变它,或者清楚的表明这个服务是有意地用于事物。
警告: 依赖注入 是 唯一 声明事物工作的方式。你不能使用new
操作符,像这样new BookService()
获取事物服务
其结果是,所有的方法都被包含在事物中,当方法体中抛出异常时,自动回滚。事物的传播级别被默认设置为 PROPAGATION_REQUIRED.
2 服务作用域
默认情况下,存取服务方法是非同步的,所以无法阻止同步执行这些函数。事实上,因为服务是单例的,可以被同时使用,你必须非常小心服务中存储状态。或者采用容易(和更好的)途径并不在y service中存储状态。
你可以通过把service放置于特定的作用域来改变这样的行为:
-
prototype
-一个新的service每次被注入到其他类时创建 -
request
- 一个新的service在每次请求时创建 -
flash
- 一个新的service只在当前或下个请求时创建 -
flow
- 在web flows中, service将存在于flow的作用域 -
conversation
- 在web flows中, service将存在于会话的作用域。根flow和它的子 flows -
session
- 一个service被创建用于session的作用域 -
singleton
(默认) - 只有一个实例的service,任何时候都存在
假如你的service为flash
,flow
或conversation
作用域,它需要实现java.io.Serializable
并只用于 Web Flow上下文
为了启用一个作用域,在你的类中添加一个静态scope属性,其值为上面所述的作用域之一:
static scope = "flow"
3 依赖注入与服务
依赖注入基础
Grails服务的一个重要方面是,有能力利用Spring 框架的依赖注入能力。 Grails支持 "依赖注入通过规约". 换句话说,你可以使用一个属性名表示的一个服务的类名,自动把他们注入到 controllers, tag libraries,等等。
作为示例,给定的服务名为BookService
,
如果你像下面这样在controller中放置一个名为bookService
的属性:
class BookController { def bookService … }
在这种情况下,Spring 容器将自动注入一个基于它自己配置作用域的服务实体。所有的依赖注入是通过名字的; Grails 不支持类型注入。你也可以像下面这样指定类型:
class AuthorService { BookService bookService }
不过, 存在副作用,即在开发模式下BookService
的改变会在加载时抛出一个错误。
依赖注入与服务
你可以使用相同的技术在一个服务中注入另一个服务。如果说,你的AuthorService
需要一个
BookService
, 可以像下面这样声明 AuthorService
:
class AuthorService { def bookService }
依赖注入与Domain类
你甚至可以在domain类中注入服务,这可以帮助开发出各种丰富的domain:
class Book {
…
def bookService
def buyBook() {
bookService.buyBook(this)
}
}
4 Using Services from Java
服务的强大在于它包含了可重用的逻辑,你可以使用来自其他类的服务,包括Java类。这里有一些方法让你重用来自Java的服务。简单的方法是把你的服务移动到grails-app/services
目录下的一个包里。这是关键步骤,因为你不可能在Java中导入一个默认package
。作为示例, BookService
就是因为上面的原因,在下面Java中不能使用:
class BookService { void buyBook(Book book) { // logic } }
不过, 把这个类放入一个package中便可修复,, 把这个类移动到
grails-app/services/bookstore
子目录,然后,修改package 声明:
package bookstore
class BookService {
void buyBook(Book book) {
// logic
}
}
package的替代是,定义个需要服务实现的接口:
package bookstore; interface BookStore { void buyBook(Book book); }
然后,服务:
class BookService implements bookstore.BookStore {
void buyBook(Book b) {
// logic
}
}
后一种方法更熟悉,
在Java端,只需要接口的引用,而不需要实现类。无论哪种方式,这个练习的目的是,在编译时,让Java能够静态解决类(或接口)的使用。现在,这样便可在
src/java
包内创建一个Java类,并提供了一个setter,在Spring中使用bean的类型和它的名字:
package bookstore; // note: this is Java class public class BookConsumer { private BookStore store;public void setBookStore(BookStore storeInstance) { this.store = storeInstance; } … }
这样一来,你可以在
grails-app/conf/spring/resources.xml
中把这个Java当做Spring bean来配置
(更多详情查看 Grails
and Spring):
<bean id="bookConsumer" class="bookstore.BookConsumer"> <property name="bookStore" ref="bookService" /> </bean>
发表评论
-
实战 Groovy: 用 Groovy 打造服务器端
2010-07-10 11:07 2737Groovlet 和 GroovyServer P ... -
实战 Groovy: 用 Groovy 生成器作标记
2010-07-10 11:07 2079Groovy 生成器让您能够利用诸如 Swing 这样 ... -
实战 Groovy: for each 剖析
2010-07-10 11:07 18217在这一期的 实战 Groovy 中,Scott Davi ... -
实战 Groovy: 用 Groovy 进行 Ant 脚本编程
2010-07-10 11:07 2071Ant 和 Maven 两者在构建处理工具的世界中占统 ... -
实战 Groovy: 在 Java 应用程序中加一些 Groovy 进来
2010-07-10 11:06 4342您有没有想过在自己相对复杂的 Java 程序中嵌入 G ... -
实战 Groovy: Groovy 的腾飞
2010-07-10 11:06 2204随着 Groovy JSR-1(及其后续发行版本)的发 ... -
实战 Groovy: 用 curry 过的闭包进行函数式编程
2010-07-10 11:06 3266在 Groovy 中处处都是闭包,Groovy 闭包惟 ... -
实战 Groovy: 关于 MOP 和迷你语言
2010-07-10 11:06 2080将耳朵贴到地上仔细听 —— MOP 正在前进!了解一下 ... -
实战 Groovy: 用 Groovy 更迅速地对 Java 代码进行单元测试
2010-07-10 11:06 2310不久以前,developerWor ... -
实战 Groovy: 构建和解析 XML
2010-07-10 11:05 7135通过本文,您将了解 ... -
实战 Groovy: 用 Groovy 进行 JDBC 编程
2010-07-10 11:05 5205这个月,随着 Andrew G ... -
实战 Groovy: 美妙的操作符
2010-07-10 11:05 2297Java™ 取消了操作符重载,但是新兴的 Groovy ... -
实战 Groovy: 使用 Groovy 模板进行 MVC 编程
2010-07-10 11:04 2936视图是 MVC 编程的一个重要部分,而 MVC 编程本 ... -
实战 Groovy: 用 Groovy 减少代码冗余
2010-07-10 11:04 2069Groovy 简洁的语法将 ... -
实战 Groovy: Groovy:Java 程序员的 DSL
2010-07-10 11:04 3087Groovy 专家 Scott Davis 将重新开始 ... -
精通 Grails: 构建您的第一个 Grails 应用程序
2010-07-06 09:37 1656Java™ 程序员不需要 ... -
Grails 部署
2010-07-06 09:36 6086部署 Grails可以使用很多种方式来部署,每一种 ... -
Grails 脚手架
2010-07-05 08:20 4085脚手架 根据指定的领域类,脚手架为你自动生成 ... -
Grails Grails 与 Hibernate
2010-07-05 08:19 2708Grails 与 Hibernate 如果 GOR ... -
Grails Grails和 Spring
2010-07-05 08:19 7927Grails和 Spring 这一节适合于高级用户 ...
相关推荐
在实际开发中,了解并遵循Grails的最佳实践至关重要,例如,合理划分领域模型、充分利用GSP标签库、使用Service层处理业务逻辑等,能有效提高代码质量和维护性。 总结,Grails 2.4.4 作为一个成熟的Web开发框架,...
- 编写清晰的Service层代码,保持Controller轻量 - 定期运行静态代码分析工具,提升代码质量 通过上述内容,我们可以看到Grails为开发者提供了高效、全面的开发环境。无论你是Java开发者寻求新的挑战,还是对...
- Controller 处理用户请求,调用Service层执行业务逻辑,最后将数据传递给View进行渲染。 3. **GORM(Grails Object Relational Mapping)** - GORM 是 Grails 提供的持久化框架,它提供了对数据库操作的简便...
通过Spring,Grails提供了强大而灵活的服务层,以及数据访问对象(DAO)的支持。 ### Hibernate持久化 Hibernate是Java世界中广泛使用的对象关系映射(Object-Relational Mapping,ORM)框架。在Grails中,它负责...
7. **Grails服务(Service)**:服务层在Grails中的作用,如何定义服务并进行事务管理。 8. **Grails过滤器(Filters)**:过滤器在应用程序中的应用,如何在特定的HTTP请求或响应之前/之后执行代码。 9. **Grails...
- **GORM的介绍**:Grails对象关系映射(GORM)是一种强大的ORM框架,简化了数据访问层的开发。 **5.2 第一个领域类对象** - **通过测试储存和获得用户**:演示如何使用GORM进行数据的增删改查操作。 - **用户参数...
2. **Grails框架结构**:Grails遵循MVC架构,包括Controller(控制器)、View(视图)、Domain(领域模型)和Service(服务)等关键组件。 3. **GORM(Grails Object-Relational Mapping)**:Grails的持久化层,...
然后,构建服务层(Service Layer)。服务层是业务逻辑的容器,它们通常处理复杂的事务和业务规则。例如,创建一个`UserService`: ```java @Service @Transactional class UserService { private final ...
例如,通过Grails的Command Objects和Service层,开发者可以轻松实现表单验证和业务逻辑处理,同时,Grails的GSP(Groovy Server Pages)视图层则方便了用户界面的创建。 在`SwingLibrary`方面,它是一个专门针对...
1. **Grails框架核心概念**:这一部分可能讲解了Grails的核心组件,如服务层(Service)、控制器(Controller)、视图(View)以及领域模型(Domain)。Grails的MVC设计模式是其核心架构,理解和掌握这些概念对于...
- **将PostService写到PostController中**:演示了如何将服务层集成到控制器中。 **7.3 数据绑定** - **绑定到已存在的对象**:讲解了如何将HTTP请求中的数据绑定到领域对象。 - **通过白名单和黑名单绑定数据**:...
标题中的“grails3 CAS链接接数据库”表明我们要讨论的是如何在Grails 3框架下集成CAS(Central Authentication Service)并实现与数据库的连接。Grails是一个基于Groovy语言的开源Web应用框架,而CAS是一种广泛使用...
Service层是无状态的,便于事务管理和单元测试。 7. **Grails的自动绑定和验证**:Grails支持自动将HTTP请求参数绑定到Controller方法的参数上,并且提供了数据验证机制,可以在模型层定义验证规则。 8. **持续...
Domain类包含了基本的CRUD功能,Controller负责处理请求,Service层处理业务逻辑,而Filter则用于全局的请求拦截。 2. **安装Grails** 要安装Grails,首先从官方网站下载最新版本,然后设置环境变量`GRAILS_HOME`...
6. **Services**:Service层是Grails应用中实现业务逻辑的地方,它们是单例的,可注入其他组件,通常用于处理复杂的业务流程或跨Controller的共享逻辑。 7. **Filters**:Filters允许在Controller Actions执行前后...
4. **Controllers与Views**:Controller处理HTTP请求,调用Service进行业务逻辑处理,然后将结果传递给View进行渲染,形成用户界面。 5. **Plugins**:Grails的插件系统允许开发者轻松复用和扩展功能,极大地提高了...
4. **服务(Service)**:服务层用于封装业务逻辑,Grails通过服务层的依赖注入来管理服务组件。 5. **插件(Plugin)**:Grails的插件系统极大地扩展了框架的功能,开发人员可以方便地引入额外的库和框架。 在...