一般动作
Grails 2.2后,引入了命名空间的机制,在不同的插件中开发的同名的 Service 类注册成的bean的名称会带上插件名称,比如:插件 PublishingUtilities 中的 com.publishing.AuthorService 类、以及插件 BookUtilities 的 com.bookutils.AuthorService 类会被分别注册成 publishingUtilitiesAuthorService 和 bookUtilitiesAuthorService。
这中机制能解决同名服务类注册的名称冲突问题,但是同时也带来了一个新的问题,开发新的应用时,需要带上插件名称来定义依赖注入的属性,如:
可是假如某天我们不再需要插件 BookUtilities 了呢,就得修改所有相关的代码;而且,如果两个插件中的同名服务类只是继承关系(新增或者覆盖了父类的某些功能),而我们希望多开发者来说透明,这样使用起来就非常的不方便了。
BroToolkit 中引入了一种插件服务类的继承机制,只需要在同名的服务类中定义一个 aliasOverridingOrder 的整型常量,就可以在系统启动时,自动将最大值的服务类注册为不带插件名的Spring Bean。当然,工程中的同名服务优先级最高。
例如下面的两个服务类:
com.bookutils.AuthorService 继承自 com.publishing.AuthorService,并且设置了一个更大的 aliasOverridingOrder 值,因此在控制器中使用依赖注入的方式定义属性 authorService 时,该属性将会是 com.bookutils.AuthorService 的实例。