Dorado 7 : Dorado对象监听器(草稿) (SEUG)

普通的对象监听器

Dorado7中的很多对象都支持个名为listener的属性,我们可以在此属性中定义一到多个的Listener用于监听对象的初始化过程。目前支持此类监听的对象包括:

  • DataType
  • DataProvider
  • DataResolver
  • ViewConfig
  • View
  • Component(即所有的控件)

可监听的动作包括:

  • beforeInit 在对象将要被初始化之前触发,此时系统为尚未将XML中配置的信息初始化到对象中。
  • onInit 在对象将被初始化之后触发,此时系统已将XML中配置的信息初始化到对象中。

定义一个监听器的方法与大多数自动方法适配相仿,同时Dorado还在此处提供了自动根据方法名确定监听动作的功能。具体的规则是如果您的方法名是以before开头的,那么Dorado会认为你希望监听beforeInit动作,否则您的方法监听到的将是onInit动作。

例如下面的方式将可以监听某按钮的beforeInit动作:

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

对于beforeInit的监听器而言,我们还可以为监听方法提供一个逻辑型的返回值,当方法返回false时,表示将要终止该对象的初始化动作,其后的Listener也将被一同跳过。如果方法不支持返回值或者返回的不是逻辑型的false值则表示继续执行后续的初始化动作。

全局对象监听器

全局对象监听器可以批量的监听上面列出的所有对象或其中的一部分对象。

全局对象监听器不支持方法自动适配,要定义一个全局对象监听器必须继承Dorado7提供的com.bstek.dorado.data.listener.GenericObjectListener<T>类。

该类包含下列3个属性:

  • order - 监听优先级,数字越小越先被触发,系统默认的order是999。
  • pattern - 要监听的范围,可使用通配符,不定义则表示全部拦截。
  • excludePattern - 不监听的范围,可使用通配符。

当利用pattern和excludePattern来判定某对象是否可被监听时,系统首先观察对象是否包含name属性,如果有则使用name属性的值来与pattern和excludePattern进行比对。否则系统进一步观察对象是否包含id属性,如果有则使用id属性的值来与pattern和excludePattern进行比对。
如此,对于DataType、ViewConfig、View而言系统将使用它们的name属性来进行判定,而对于Component(即所有的控件)而言则将使用它们的id属性。

通过pattern和excludePattern并不是唯一的用来设定监听范围的方法,事实上比这更加常用的应该是利用GenericObjectListener类的泛型。
例如下面的代码因为指定了泛型,将确定该监听器只能监听系统中所有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
	}
}

向系统中注册一个全局对象监听器的方法如下:

<bean parent="dorado.genericObjectListenerRegister">
	<property name="listener">
		<bean class="test.ViewListener" >
			<property name="order" value="1" /> <!-- 拦截优先级 -->
			<property name="pattern" value="*" /> <!-- 要拦截哪一类View -->
			<property name="excludePattern" value="com.bstek.public.*" /> <!-- 不拦截哪一类View -->
		</bean>
	</property>
</bean>

Comments:

除了显式在xml中注册,能否提供Annotation自动注册的方式。

Posted by vangie.du@bstek.com at Jul 18, 2011 19:31

当然可以考虑。之所以没有提及提供是因为我希望用一段时间让这一类对Annotation的需求积累一下,再做通盘考虑。

Posted by benny.bao@bstek.com at Jul 18, 2011 23:36