Aries NamespaceHandler获取Bean的引用

时间:2016-02-07 08:47:43

标签: java osgi blueprint-osgi aries

在成功尝试使用Namespace Handler实现我自己的蓝图拦截器来跟踪方法入口/出口之后,我现在正在寻找增强它,其中拦截器本身被定义为同一蓝图xml中的另一个bean并且我的命名空间元素使用REF =" interceptorBeanName&#34 ;.即,我试图注册一个实际上委托给同一蓝图中定义的另一个拦截器实例的拦截器。

但是,如何获取蓝图中定义的Interceptor 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;
}

1 个答案:

答案 0 :(得分:1)

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

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

例如,请参阅tx annotation parser

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

例如,请参阅jpa processor

旧答案

如果你想在一个aries-blueprint NamespaceHandler中创建对另一个bean的引用,你可以使用RefMetaData,并将这个ref关联成普通的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")));