`

Grails Service 层

阅读更多

 

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, flowconversation 作用域,它需要实现 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>
分享到:
评论

相关推荐

    Grails Grails Grails

    Grails Grails Grails Grails Grails

    Grails权威指南 Grails权威指南

    Grails权威指南Grails权威指南Grails权威指南Grails权威指南Grails权威指南Grails权威指南

    Grails1.1中文文档

    当今的Java Web开发技术显得过于复杂,相对于它本身的需要来说。现在主流的Java Web框架也是异常复杂,而且没有很好的遵循 Don't Repeat ...本文档将带你从Grails入门开始,最终能够使用Grails框架建设Web应用程序。

    Grails 教程

    像Rails,Django和TurboGears这样的动态框架在Web开发领域开辟了一条新的道路,Grails基于这些概念之上,采用动态方法减小了Java平台上进行Web开发的复杂度,不过与那些框架不同的是,Grails是构建在Spring和...

    Eclipse下搭建Grails项目

    Grails项目的应用越来越多,而对于初学者来说,在Eclipse下搭建Grails项目是一个难题,这个文档将教会你如何搭建Grails项目,希望对你有所帮助。

    Grails入门指南 -- 针对grails1.0.4更新

    Grails入门指南中文pdf -- 针对grails1.0.4更新,附加idea8 开发grails的流程

    grails+Xfire webservice

    grails+Xfire webservice

    grails

    grails-2.1.zip.001

    Groovy轻松入门——Grails实战基础篇

    在学习任何东西之前,最重要的是培养兴趣,Groovy世界最耀眼的技术之一--Grails相信大家早已耳闻,我将通过Grails实战系列文章 向您展现Grails的迷人风采,使您感受到Grails的魅力,以至疯狂地爱上Grails,并坠入...

    grails开发环境配置及应用开发

    详细讲解grails开发环境配置。 详细讲解grails连接mysql数据库,crud开发

    Grails中文参考手册

    Grails 中文 参考手册

    grails 1.0.4

    Grails专为下一代JavaWeb应用程序而设计的框架,其借助于Groovy动态语言,使Web开发变得简单而方便。Grails尽量为更多现有的Java项目创建一个全面的框架(不仅局限于视图处理),这和当前一些Java框架提供给用户的一...

    grails3.2.8-01

    grails3.2.8 part1

    grails入门经典

    grails grails入门经典 grails入门 grails例子 grails资料 通过自学一点点积累起来的,相信对你有帮助的。

    Grails1.3.7参考手册

    Grails 1.3.7英文版官方参考手册,学习Grails的权威指南

    grails-2.3.6.zip

    grails-2.3.6

    grails 中文文档+grails-fckeditor-0.9.5.zip插件

    grails 中文文档+grails-fckeditor-0.9.5.zip插件

    grails框架

    grails的插件系统也是其亮点之一。首先,和rails,django等web框架类似,基于微内核的思想,插件(可重用模块)是框架的一等公民。grails除了核心模块以外的功能几乎都是通过插件方式实现的。实际上,一个grails插件...

    grails-docs-1.0.3

    grails参考文档 The Grails Framework - Reference Documentation Authors: Graeme Rocher, Marc Palmer Version: 1.0.3

Global site tag (gtag.js) - Google Analytics