對象監(jiān)聽器

2024-03-07 18:37 更新

普通的對象監(jiān)聽器

Dorado中的很多對象都支持個名為listener的屬性,我們可以在此屬性中定義一到多個的Listener用于監(jiān)聽對象的初始化過程。目前支持此類監(jiān)聽的對象包括: DataTypeDataProviderDataResolverViewConfigViewComponent(即所有的控件)可監(jiān)聽的動作包括: beforeInit 在對象將要被初始化之前觸發(fā),此時系統(tǒng)為尚未將XML中配置的信息初始化到對象中。onInit 在對象將被初始化之后觸發(fā),此時系統(tǒng)已將XML中配置的信息初始化到對象中。定義一個監(jiān)聽器的方法與大多數(shù)自動方法適配相仿,同時Dorado還在此處提供了自動根據(jù)方法名確定監(jiān)聽動作的功能。具體的規(guī)則是如果您的方法名是以before開頭的,那么Dorado會認為你希望監(jiān)聽beforeInit動作,否則您的方法監(jiān)聽到的將是onInit動作。 例如下面的方式將可以監(jiān)聽某按鈕的beforeInit動作:

...
public void beforeInit(Button button) {
    // your code
}
...

對于beforeInit的監(jiān)聽器而言,我們還可以為監(jiān)聽方法提供一個邏輯型的返回值,當方法返回false時,表示將要終止該對象的初始化動作,其后的Listener也將被一同跳過。如果方法不支持返回值或者返回的不是邏輯型的false值則表示繼續(xù)執(zhí)行后續(xù)的初始化動作。

全局對象監(jiān)聽器

全局對象監(jiān)聽器可以批量的監(jiān)聽上面列出的所有對象或其中的一部分對象。 全局對象監(jiān)聽器不支持方法自動適配,要定義一個全局對象監(jiān)聽器必須繼承Dorado提供的com.bstek.dorado.data.listener.GenericObjectListener<T>類。 該類包含下列3個屬性: order - 監(jiān)聽優(yōu)先級,數(shù)字越小越先被觸發(fā),系統(tǒng)默認的order是999。pattern - 要監(jiān)聽的范圍,可使用通配符,不定義則表示全部攔截。excludePattern - 不監(jiān)聽的范圍,可使用通配符。當利用pattern和excludePattern來判定某對象是否可被監(jiān)聽時,系統(tǒng)首先觀察對象是否包含name屬性,如果有則使用name屬性的值來與pattern和excludePattern進行比對。否則系統(tǒng)進一步觀察對象是否包含id屬性,如果有則使用id屬性的值來與pattern和excludePattern進行比對。 如此,對于DataType、ViewConfig、View而言系統(tǒng)將使用它們的name屬性來進行判定,而對于Component(即所有的控件)而言則將使用它們的id屬性。

通過pattern和excludePattern并不是唯一的用來設(shè)定監(jiān)聽范圍的方法,事實上比這更加常用的應(yīng)該是利用GenericObjectListener類的泛型。 例如下面的代碼因為指定了泛型,將確定該監(jiān)聽器只能監(jiān)聽系統(tǒng)中所有View的初始化動作:

public class ViewListener extends GenericObjectListener<View> {
    @Override
    public boolean beforeInit(View view) throws Exception {
        // your code
    }

 
    @Override
    public void onInit(View view) throws Exception {
        // your code
    }
}

向系統(tǒng)中注冊一個全局對象監(jiān)聽器的方法如下:

<bean parent="dorado.genericObjectListenerRegister">
    <property name="listener">
        <bean class="test.ViewListener" >
            <property name="order" value="1" /> <!-- 攔截優(yōu)先級 -->
            <property name="pattern" value="*" /> <!-- 要攔截哪一類View -->
            <property name="excludePattern" value="com.bstek.public.*" /> <!-- 不攔截哪一類View -->
        </bean>
    </property>
</bean>
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號