插件开发时，如何实现service类的继承（或同名类）?
李小翔
2013-11-26 10:07

内容列表

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 的实例。