欢迎进入Wiki » FAQ » 插件开发时,如何实现service类的继承(或同名类)?

插件开发时,如何实现service类的继承(或同名类)?

在2013-11-26 10:07上被李小翔修改
评论 (0) · 附件 (0) · 记录 · 信息

Grails 2.2后,引入了命名空间的机制,在不同的插件中开发的同名的 Service 类注册成的bean的名称会带上插件名称,比如:插件 PublishingUtilities 中的 com.publishing.AuthorService 类、以及插件 BookUtilities 的 com.bookutils.AuthorService 类会被分别注册成 publishingUtilitiesAuthorService 和 bookUtilitiesAuthorService。

这中机制能解决同名服务类注册的名称冲突问题,但是同时也带来了一个新的问题,开发新的应用时,需要带上插件名称来定义依赖注入的属性,如:

class FoobarController {
   def publishingUtilitiesAuthorService
}

可是假如某天我们不再需要插件 BookUtilities 了呢,就得修改所有相关的代码;而且,如果两个插件中的同名服务类只是继承关系(新增或者覆盖了父类的某些功能),而我们希望多开发者来说透明,这样使用起来就非常的不方便了。

BroToolkit 中引入了一种插件服务类的继承机制,只需要在同名的服务类中定义一个 aliasOverridingOrder 的整型常量,就可以在系统启动时,自动将最大值的服务类注册为不带插件名的Spring Bean。当然,工程中的同名服务优先级最高。

例如下面的两个服务类:

// 插件 PublishingUtilities
class AuthorService {
   static aliasOverridingOrder = 100;
}

// 插件 BookUtilities
class AuthorService extends com.publishing.AuthorService {
   static aliasOverridingOrder = com.publishing.AuthorService.aliasOverridingOrder + 100;
}

// 示例控制器
class FoobarController {
   // com.bookutils.AuthorService
   def authorService
}

com.bookutils.AuthorService 继承自 com.publishing.AuthorService,并且设置了一个更大的 aliasOverridingOrder 值,因此在控制器中使用依赖注入的方式定义属性 authorService 时,该属性将会是 com.bookutils.AuthorService 的实例。

标签: grails BroToolkit
在2013-11-26 10:07上被李小翔创建

Copyright © 2013 北京博瑞开源软件有限公司
京ICP备12048974号