gpt4 book ai didi

java - 如何从 Condition Autowiring 属性 bean

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:21:00 26 4
gpt4 key购买 nike

有没有办法在 Condition 中 Autowiring bean?

还有下一个例子。我们有 2 个 FileManager 的实现。其中一个实现应该根据属性“平台”进行初始化。通过 Archaius 处理属性。

@Component
public class AwsPlatformCondition implements Condition {

@Autowired
private ArchaiusProperties archaiusProperties;

@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
return "aws".equalsIgnoreCase(archaiusProperties.getStringProperty(PropertiesMapper.PLATFORM));
}
}

.

@Component
public class StandardPlatformCondition implements Condition {

@Autowired
private ArchaiusProperties archaiusProperties;

@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
return "standard".equalsIgnoreCase(archaiusProperties.getStringProperty(PropertiesMapper.PLATFORM));
}
}

.

@Component
@Conditional(AwsPlatformCondition.class)
public class AS3FileManager implements FileManager {
...
}

.

@Component
@Conditional(StandardPlatformCondition.class)
public class NativeFileManager implements FileManager {
...
}

此代码无效。主要原因是 ArchaiusProperties bean 在条件匹配时没有初始化。有没有办法在条件下使用 ArchaiusProperties bean 之前初始化它?

最佳答案

如果我们看一下java docs对于 Condition界面-

Conditions must follow the same restrictions as BeanFactoryPostProcessor and take care to never interact with bean instances.

限制是(java docsBeanFactoryPostProcessor )

A BeanFactoryPostProcessor may interact with and modify bean definitions, but never bean instances. Doing so may cause premature bean instantiation, violating the container and causing unintended side-effects.

所以您要实现的目标是不推荐;已经遇到的副作用。

但是,如果我们在文档中进一步挖掘 Condition我们得到

For more fine-grained control of conditions that interact with @Configuration beans consider the ConfigurationCondition interface.

这里也违反了限制。因此,总而言之,使用 Condition在这种情况下不是一个好主意。

所以 IMO 对你来说最好的选择是使用 @Profile您可以在其中一次激活所需的配置文件并使用相应的 bean;不考虑附加的装饰。

关于java - 如何从 Condition Autowiring 属性 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28556627/

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