【问题标题】:Aries NamespaceHandler to get Reference of BeanAries NamespaceHandler 获取 Bean 的引用
【发布时间】:2016-05-17 01:01:14
【问题描述】:

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

但是,如何获取蓝图中定义的Interceptor bean的Reference?

我在 Google 上搜索了好几个小时。但是,在 Blueprint 中没有任何关于如何做到这一点的文档。

我们将非常感谢任何有关如何解决此问题的帮助。

编辑:

@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;
}

【问题讨论】:

    标签: java osgi blueprint-osgi aries


    【解决方案1】:

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

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

    例如查看tx annotation parser

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

    例如查看jpa processor

    旧答案:

    如果您愿意,在 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")));
    

    【讨论】:

    • 我了解您建议使用 RefMetadata,但我无法了解此 MutableBeanMetadata 的用途以及何时/如何使用?能否请您详细说明。
    • 我以为你正在实现一个新的命名空间处理程序,我错了。我不明白你的问题。
    • 是的。我正在实施新的命名空间处理程序。刚刚意识到您提到的 DelegateInterceptor 是我自己的接口,必须为其创建 bean 并在 ref 属性中提及,对吗?
    • 是的,你没有发布任何代码,所以我只是发布了一个如何在另一个 bean 中注入 ref 的示例。这个“delegateinterceptor”是你的bean,它作为对另一个拦截器的引用——这个引用在蓝图容器中按名称(ref)找到
    • 很好。但是,我的Interceptor 如何实际调用delegate.preCall - 如何解析delegate 的值是我所震惊的。如果您可以展示一些示例或提供一些指向文档的指针,那就太好了。
    猜你喜欢
    • 2011-02-27
    • 2020-02-23
    • 1970-01-01
    • 2016-08-30
    • 2012-12-12
    • 2012-09-11
    • 1970-01-01
    • 2018-04-03
    • 2014-02-21
    相关资源
    最近更新 更多