在成功尝试实现我自己的蓝图拦截器以使用命名空间处理程序跟踪方法进入/退出后,我现在正在寻找增强它,其中拦截器本身被定义为同一蓝图xml中的另一个bean,并且我的命名空间元素使用ref="interceptorBeanName"。 即,我正在尝试注册一个拦截器,该拦截器实际上委托给同一蓝图中定义的另一个拦截器实例。
但是,如何获取蓝图中定义的拦截器Bean的引用?
我在谷歌上搜索了很多小时。但是,没有任何关于如何在蓝图中执行此操作的文档。
有关如何解决此问题的任何帮助将不胜感激。
编辑:
@Override
public ComponentMetadata decorate(Node node, ComponentMetadata compMeta,
ParserContext cxt) {
cxt.getComponentDefinitionRegistry().registerInterceptorWithComponent(compMeta, new Interceptor() {
@Override
public Object preCall(ComponentMetadata arg0, Method arg1, Object... arg2)
throws Throwable {
info_logger.info(arg1.getName() + " before call");
return null;
}
@Override
public void postCallWithReturn(ComponentMetadata arg0, Method arg1,
Object arg2, Object arg3) throws Throwable {
info_logger.info(arg1.getName() + " after call");
}
@Override
public void postCallWithException(ComponentMetadata arg0, Method arg1,
Throwable arg2, Object arg3) throws Throwable {
info_logger.info(arg1.getName() + " after exception");
}
@Override
public int getRank() {
return 0;
}
});
return compMeta;
}
我看到两种可能性,使用BeanProcessor或ComponentDefinitionRegistryProcessor
BeanProcessor 是一个经典的 bean,可以像任何其他 bean 一样注入,但它们可以预处理/后处理其他 bean 定义,并在此 bean 定义上添加一个拦截器。 这个受体可以参考其他豆
子例如,请参阅 TX 注释解析器
ComponentDefinitionRegistryProcessor 在 Bean 定义之后、上下文启动之前调用。 它可以使用蓝图容器,它引用上下文的所有 bean,也可以添加拦截器。 在蓝图容器的帮助下,拦截器可以引用上下文的其他 bean。
例如,请参阅 JPA 处理器
旧答案:
如果你想,在 aries-blueprint 命名空间处理程序中,创建一个对另一个 bean 的引用,你可以使用 RefMetaData
,并像普通 bean 一样关联这个 ref。
private RefMetadata createRef(ParserContext context, String value) {
MutableRefMetadata m = context.createMetadata(MutableRefMetadata.class);
m.setComponentId(value);
return m;
}
和类似的东西:
MutableBeanMetadata metadata = context.createMetadata(MutableBeanMetadata.class);
metadata.addRuntimeClass(DelegateInterceptor.class);
...
metadata.addProperty("delegate", createRef(pc, element.getAttribute("ref")));