这个地方思维模式比较新颖,这里翻译一下:
有时候一个bean了解其他已经发布的bean的信息是非常重要的。比如一个管理类需要了解他管理的bean对象的列表。比起将注册代码放到每一个发布的bean中,管理类在发布类的时候自动回调将是一种更好的解决方案。jboss的微内核可以通过@Install/@Uninstall注释或者<incallback>/<uncallback> 标签定义.
注意:incallback是installCallback的缩写,uncallback是uninstallCallback的缩写
public class Example {
@Install
public void addEditor(Editor editor) {
...
}
@Uninstall
public void removeEditor(Editor editor) {
...
}
}
<bean name="editorHolder" class="com.acme.Example">
<incallback method="addEditor"/>
<uncallback method="removeEditor"/>
</bean>
上面的二段代码表示一个是一个意思,在每一个Editor的对象发布的时候,都会调用容器eidtorHolder的addEditor方法,相同道理,在每个Editor销毁的时候都会调用removeEditor方法。缺省情况下通过回调定义的方法中的参数的bean的类型决定查找的类,如果管理类中有多个同名的方法,但是参数不同,如果想发布某一特定的方法,可以在incallback标签中定义signature属性指定参数的名称
public class Example {
public void addEditor(Editor editor) {
...
}
@Install
public void addEditor(DifferentEditor editor) {
...
}
}
<bean name="editorHolder" class="com.acme.Example">
<incallback method="addEditor" signature="org.jboss.example.DifferentEditor"/>
</bean>
上面的二段代码表示的是相同的意思,只是给DifferentEditor实例化的时候进行回调。
每个bean可以定义多个回调函数,他会按照定义出现的顺序执行
public class Example {
@Install
public void addEditor(Editor editor) {
...
}
@Install
public void addViewer(Viewer viewer) {
...
}
@Uninstall
public void removeEditor(Editor editor) {
...
}
@Uninstall
public void removeViewer(Viewer viewer) {
...
}
}
<bean name="editorHolder" class="com.acme.Example">
<incallback method="addEditor"/>
<incallback method="addViewer"/>
<uncallback method="removeEditor"/>
<uncallback method="removeViewer"/>
</bean>
缺省状态下是匹配到发布的被管理的bean到INSTALLED 状态的时候就会执行回调函数,也可以指定bean调用回调函数的的状态
public class Example {
@Install(dependentState="Configured")
public void addEditor(Editor editor) {
...
}
}
<bean name="editorHolder" class="com.acme.Example">
<incallback method="addEditor" state="Configured"/>
</bean>
这样bean会在发布到Configured状态的时候执行回调函数,
<!--我个人添加的注释>
其中包括的状态如下
NOT_INSTALLED - deployment descriptor parsed
DESCRIBED - aop dependencies added to the bean
INSTANTIATED - an instance has been created
CONFIGURED - properties have been injected
CREATE - the create method, if defined, was called
START - the start method, if defined, was called
INSTALLED - custom install actions executed, bean is ready to access
<!--我个人添加的注释结束>
我们也可以给发布的bean配置whenRequired 属性
public class Example {
@Install(whenRequired="Installed")
public void addEditor(Editor editor) {
...
}
}
<bean name="editorHolder" class="com.acme.Example">
<incallback method="addEditor" whenRequired="Installed"/>
</bean>
这样我们的管理类在到Installed状态的时候才会调用,默认状态时CONFIGURED
最后我们可以定义我们的bean管理类可以依赖的发布的bean的数量,通过cardinality 属性
public class Example {
@Install(cardinality="2..n")
public void addEditor(Editor editor) {
...
}
}
<bean name="editorHolder" class="com.acme.Example">
<incallback method="addEditor" cardinality="2..n"/>
</bean>
这样定义表示我们的editorHolder只有在第二次到第n次发布的时候才会执行。