gpt4 book ai didi

java - 使用 NameSpaceHandler 时 Spring bean 之间的引用

转载 作者:行者123 更新时间:2023-11-30 09:55:08 25 4
gpt4 key购买 nike

我正在尝试使用 Spring 上下文命名空间在应用程序中构建一些现有的配置对象。我已经定义了一个上下文,如果工作令人满意的话,我几乎已经定义了 - 但是,我希望我的命名空间定义的一个 bean 隐式引用另一个:

考虑名为“Node”的类:

public Class Node {
private String aField;
private Node nextNode;
public Node(String aField, Node nextNode) {
...
}

现在在我的 Spring 上下文中我有这样的东西:

<myns:container>
<myns:node aField="nodeOne"/>
<myns:node aField="nodeTwo"/>
</myns:container>

现在我希望 nodeOne.getNextNode() == nodeTwotrue。因此 nodeOne.getNextNode()nodeTwo 引用同一个 bean 实例。这些几乎是我的 AbstractBeanDefinitionParser 中的相关部分:

public AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) {
...
BeanDefinitionBuilder containerFactory = BeanDefinitionBuilder.rootBeanDefinition(ContainerFactoryBean.class);
List<BeanDefinition> containerNodes = Lists.newArrayList();
String previousNodeBeanName;

// iterate backwards over the 'node' elements
for (int i = nodeElements.size() - 1; i >= 0; --i) {
BeanDefinitionBuilder node = BeanDefinitionBuilder.rootBeanDefinition(Node.class);
node.setScope(BeanDefinition.SCOPE_SINGLETON);

String nodeField = nodeElements.getAttribute("aField");
node.addConstructorArgValue(nodeField);

if (previousNodeBeanName != null) {
node.addConstructorArgValue(new RuntimeBeanReference(previousNodeBeanName));
} else {
node.addConstructorArgValue(null);
}

BeanDefinition nodeDefinition = node.getBeanDefinition();
previousNodeBeanName = "inner-node-" + nodeField;
parserContext.getRegistry().registerBeanDefinition(previousNodeBeanName, nodeDefinition);

containerNodes.add(node);
}
containerFactory.addPropertyValue("nodes", containerNodes);
}

创建应用程序上下文时,我的 Node 实例被创建并被识别为单例。此外,nextNode 属性由具有先前节点配置的 Node 实例填充 - 但是,它不是相同的实例。

如果我在 Node 的构造函数中输出一条日志消息,我会看到为每个节点 bean 定义创建了两个实例。

我自己可以想到一些解决方法,但我更愿意使用现有模型。那么谁能告诉我如何传递这些运行时 bean 引用,以便为我的 Node 实例获得正确的单例行为?

最佳答案

我想问题是你实际上有每个节点定义的两个实例 - 一个作为顶级节点(通过 registerBeanDefinition),另一个在 nodes 属性中ContainerFactoryBean。也许,您应该将 RuntimeBeanReference 的节点放入 ContainerFactoryBean 中。

关于java - 使用 NameSpaceHandler 时 Spring bean 之间的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2968122/

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