gpt4 book ai didi

java - Aries NamespaceHandler 获取 Bean 的引用

转载 作者:行者123 更新时间:2023-12-01 10:28:03 26 4
gpt4 key购买 nike

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

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

我在 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 一样注入(inject),但它们可以预处理/后处理其他 bean 定义,并在此 bean 定义上添加拦截器。这个incerceptor可以引用其他bean

例如,参见 tx annotation parser

ComponentDefinitionRegistryProcessor 在 bean 定义之后、上下文启动之前调用。它可以使用BlueprintContainer,它引用上下文的所有bean,并且也可以添加拦截器。在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")));

关于java - Aries NamespaceHandler 获取 Bean 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35251464/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com