Aries NamespaceHandler 获取 Bean 的引用

Aries NamespaceHandler to get Reference of Bean

在成功尝试实现我自己的蓝图拦截器以使用命名空间处理程序跟踪方法 entry/exits 之后,我现在正在寻找增强它的方法,其中拦截器本身被定义为同一蓝图中的另一个 bean xml 和我的命名空间元素使用 ref="interceptorBeanName"。即,我正在尝试注册一个拦截器,该拦截器实际上委托给在同一蓝图中定义的另一个拦截器实例。

但是,如何获取蓝图中定义的拦截器bean的引用?

我在 Google 中搜索了好几个小时。但是,没有任何关于如何在蓝图中执行此操作的文档。

任何有关如何解决此问题的帮助将不胜感激。

编辑:

@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 一样注入,但是它们可以 preprocess/postprocess 其他 beans 定义,并在这个 bean 定义上添加一个拦截器。这个 incerceptor 可以参考其他 bean

例如参见 [​​=13=]

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

例如 jpa processor

旧答案

如果你想在 aries-blueprint NamespaceHandler 中创建对另一个 bean 的引用,你可以使用 RefMetaData,并像普通 bean 一样关联此引用。

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")));