service的定義
1、概述
在hivemind中,一個service是一個簡單的實(shí)現(xiàn)特定接口的對象,你可以提供此接口的核心實(shí)現(xiàn),使用者可以通過實(shí)現(xiàn)此接口來覆蓋你的實(shí)現(xiàn)。模塊的定義可以包含<service-poit>元素來定義服務(wù),一個模塊可以包含任意多的服務(wù)。
2、創(chuàng)建模式
Service有四種創(chuàng)建模式:primitive(主要的)、singleton(單例的)、threaded(線程的)和pooled(池化的)。在primitive和singleton模式中,每一個服務(wù)最終只會生成一個實(shí)例。在threaded和pooled模式中,同時可能有多個實(shí)例,但是每個線程只會有一個實(shí)例。各個模式的定義如下:
Primitive:服務(wù)在第一次參考時被構(gòu)造
Singleton:服務(wù)在第一此調(diào)用接口的方法時被構(gòu)造
Threaded:第一次調(diào)用接口的方法時構(gòu)造,并綁定到當(dāng)前線程
Pooled:同Threaded,但服務(wù)的實(shí)現(xiàn)被儲存在池中
Hivemind使用代理模式來創(chuàng)建實(shí)例,除了primitive創(chuàng)建模式。代理類實(shí)現(xiàn)了服務(wù)接口,按需要構(gòu)造實(shí)際的實(shí)現(xiàn)類。
3、定義方法
一個服務(wù)包含一個實(shí)現(xiàn)類和任意多的攔截類,攔截類可以實(shí)現(xiàn)日志、安全、事務(wù)定義和性能觀測等功能。一般一個服務(wù)代理將首先創(chuàng)建,當(dāng)代理類的方法被調(diào)用時,實(shí)際的服務(wù)實(shí)現(xiàn)類被構(gòu)造和配置,所有的攔截類被創(chuàng)建。
定義如下:
<service-point id="MyService" interface="com.myco.MyServiceInterface"> <create-instance class="com.myco.impl.MyServiceImpl"/> <interceptor service-id="hivemind.LoggingInterceptor"/></service-point>
屬性定義如下表所示
屬性
類別
必需
描敘
id
字符串
是
服務(wù)擴(kuò)展點(diǎn)的簡單id,全寫的id通過前邊加上模塊id來獲得
interface
類名
否
此服務(wù)擴(kuò)展點(diǎn)支持的接口的名字,如果沒有定義,則默認(rèn)為服務(wù)id,全協(xié)的名稱通過前邊加上模塊的報名來獲得
parameters-schema-id
字符串
否
用來參考模塊中定義的schema,schema定義了此服務(wù)需要用到的參數(shù),當(dāng)服是通過ServiceImplementationFactory或者 ServiceInterceptorFactory.類定義時。
parameters-occurs
unbounded | 0..1 | 1 | 1..n | none
否
參數(shù)元素允許的數(shù)量:
unbounded: 無窮 0..1: 可選 1 (default) :必須 1..n: 至少一個 none:不允許
服務(wù)定義中可以包含 <create-instance>、 <interceptor>、<invoke-factory> 、<parameters-schema>定義。
4、服務(wù)的創(chuàng)建
服務(wù)可以通過兩種方式來構(gòu)造實(shí)例創(chuàng)建和實(shí)現(xiàn)工廠,實(shí)例創(chuàng)建表現(xiàn)為<create-instance>元素,實(shí)現(xiàn)工廠表現(xiàn)為<invoke-factory>元素。
<create-instance> 直接實(shí)例化一個接口的實(shí)現(xiàn)類
屬性
類別
必需
描敘
class
類名
是
用來實(shí)例化的類名,此類中的屬性不需要額外配置
model
primitive | singleton | threaded | pooled
否
指定構(gòu)造模式,singleton是默認(rèn)模式
<invoke-factory> 通過另一個服務(wù)來實(shí)例化一個接口的實(shí)現(xiàn)類,它包含一個service-id屬性,定義了一個實(shí)現(xiàn)ServiceImplementationFactory接口的服務(wù)。通過此方式創(chuàng)建的service將通過service的接口類型自動綁定各個服務(wù)。
屬性
類別
必需
描敘
service-id
字符串
否
工廠服務(wù)的id,可以是統(tǒng)一模塊中的簡單id,也可以是全寫的id。如果沒有確定,默認(rèn)為hivemind.BuilderFactory服務(wù)
model
primitive | singleton
| threaded | pooled
否
指定構(gòu)造模式,singleton是默認(rèn)模式
5、攔截器的定義
攔截器使用<interceptor>來表示,屬性service-id標(biāo)識一個服務(wù)攔截器工廠服務(wù),工廠服務(wù)實(shí)現(xiàn)了ServiceInterceptorFactory接口。
屬性
類別
必需
描敘
service-id
字符串
是
服務(wù)的id
before
字符串
否
一個服務(wù)id的列表,這些服務(wù)需要在此服務(wù)后執(zhí)行
after
字符串
否
一個服務(wù)id的列表,這些服務(wù)需要在此服務(wù)前執(zhí)行
name
字符串
否
用來排序,沒有指定的話,默認(rèn)為service-id
服務(wù)id的列表以逗號分隔每個服務(wù)。
6、工廠參數(shù)的定義
<invoke-factory>可能需要取得一些參數(shù)來配置需要的信息,所以定制工廠的參數(shù)是必要的。Schema用于統(tǒng)一定義數(shù)據(jù)的表現(xiàn)形式,針對參數(shù)的定義有個具體的parameters-schema來使用,parameters-schema不象shema那樣可以單獨(dú)定義,它只能出現(xiàn)在<service-point>定義中,而且跟parameters-schema-id的定義互斥,兩者只能出現(xiàn)一個。