Я пытаюсь использовать пространство имен контекста Spring для создания некоторых существующих объектов конфигурации в приложении. Я определил контекст, и, если он работает удовлетворительно, то в значительной степени он есть - однако мне бы хотелось, чтобы один бин, определенный моим пространством имен, неявно ссылался на другой:
Рассмотрим класс с именем '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() == nodeTwo
было true
. Так что nodeOne.getNextNode()
и nodeTwo
ссылаются на один и тот же экземпляр компонента. Это в значительной степени соответствующие части, которые я имею в моем 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-компонентов времени выполнения, чтобы я получил правильное поведение синглтона для моих Node
экземпляров?