0

在成功尝试实现我自己的蓝图拦截器以使用命名空间处理程序跟踪方法进入/退出后,我现在正在寻找增强它,其中拦截器本身被定义为同一蓝图 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;
}
4

1 回答 1

1

我看到两种可能性,使用 BeanProcessor 或 ComponentDefinitionRegistryProcessor

BeanProcessor 是一个经典的 bean,它可以像任何其他 bean 一样被注入,但是它们可以预处理/后处理其他 bean 定义,并在这个 bean 定义上添加一个拦截器。这个拦截器可以参考其他 bean

参见例如tx 注释解析器

一个 ComponentDefinitionRegistryProcessor 在定义 bean 之后,但在上下文启动之前被调用。它可以使用BlueprintContainer,它引用上下文的所有bean,也可以添加拦截器。在 BlueprintContainer 的帮助下,拦截器可以引用上下文的其他 bean。

参见例如jpa 处理器

旧答案

如果您愿意,在 aries-blueprint NamespaceHandler 中,创建对另一个 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")));
于 2016-02-07T11:08:51.393 回答