gpt4 book ai didi

java - 插入新 bean 时如何更新现有的 Autowiring 属性?

转载 作者:行者123 更新时间:2023-12-01 05:46:15 26 4
gpt4 key购买 nike

我们有 Autowiring 某种类型的 bean 的组件类:

@Component
public class MyComponent {
@Autowire
public IValidators[] validators;
}

我们的应用程序允许创建 Groovy 类,这些类在运行时编译并使用 ScriptFactoryPostProcessor 向 Spring 注册:

ConstructorArgumentValues args = new ConstructorArgumentValues();
args.addGenericArgumentValue(groovySourceLocation); //location is on the file system
RootBeanDefinition def = new RootBeanDefinition(GroovyScriptFactory.class, args, null);
BeanDefinitionRegistry r = (BeanDefinitionRegistry) this.applicationContext.getBeanFactory();
r.registerBeanDefinition(beanName, def); //beanName is the same as the class name

//scriptFactoryPostProcessor is autowired into class from applicationConfig
scriptFactoryPostProcessor.postProcessBeforeInstantiation(GroovyScriptFactory.class, beanName);

groovy bean 已正确创建,因为我可以通过 bean 名称或类型从 applicationContext 中检索它。但是组件已经 Autowiring 的属性没有添加的bean。当 groovy 类实现 IValidator 时,我希望使用添加到集合中的新 groovy bean 来更新 Autowiring IValidator 类型的任何组件类。我该怎么做?

更新

查看源代码后,我认为 Spring 无论如何都不支持我的期望。我最后的希望是我可以请求某种类型的依赖 bean(类似于 getDependentBeans(String beanName) ),但它不存在,而且从表面上看,Spring 不会根据类型跟踪依赖关系。

最佳答案

非常有趣的问题。最简单的方法: make MyComponent原型(prototype)并在每次需要时创建新实例。这样 Spring 将使用最新的 IValidator 列表执行 Autowiring 。实例。考虑<lookup-method/> .

不太优雅的方法是使用一个工厂(不是 FactoryBean )来检索所有实现 IValidator 的 bean按需提供,只需在需要时调用该工厂即可。当然,根本不符合 Spring 精神。

其他方法更加麻烦且容易出错。您可以创建自己的后处理器来添加新发现的 IValidator到所有需要所有列表的类。您还可以开发自己的 List<IValidator> 实现这将查找 ApplicationContext每次请求 - 有点具有挑战性,特别是考虑到并发性时。

最后有一种复合设计模式:只有一个 IValidator这会将所有调用委托(delegate)给目标 IValidator 列表在 ApplicationContext 中手动发现.

关于java - 插入新 bean 时如何更新现有的 Autowiring 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5862547/

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