当前位置: 首页 > 知识库问答 >
问题:

如何从条件自动关联属性bean

莫翰藻
2023-03-14

有没有人可以在条件下自动装配bean?

下面是一个例子。我们有两个FileManager实现。其中一个实现应该在依赖属性“platform”中初始化。通过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之前,有没有方法初始化它?

共有1个答案

柯耀
2023-03-14

如果我们看看java文档中的条件接口-

条件必须遵循与BeanFactoryPostProcessor相同的限制,并且注意不要与bean实例交互。

限制包括(来自BeanFactoryPostProcessor的java文档)

BeanFactoryPostProcessor可以与bean定义交互并修改bean定义,但决不能修改bean实例。这样做可能会导致过早实例化bean,违反容器并导致意外的副作用。

所以你试图实现的是不推荐的东西;已经遇到的副作用。

然而,如果我们在文档中进一步挖掘条件

要更细粒度地控制与@configurationbean交互的条件,请考虑ConfigurationCondition接口。

这里的限制也是违反的。因此,在这个场景中使用条件并不是一个好主意。

因此,在我看来,你最好选择@Profile,在这里你可以一次激活所需的概要文件,并使用相应的bean;不考虑附带的装饰。

 类似资料:
  • 我到处找,找不到我问题的答案。所以我想要一个只在特定条件下显示的条件属性,例如: 如您所见,我只想在等于默认值时指示按钮处于活动状态。然而,我得到了意想不到的令牌,错误... 但当我尝试将属性放在前面时,例如: 它传递语法错误并显示良好,但这不是我想要实现的。 我怎样才能解决这个问题?它没有通过的原因是什么? 因此,我刚刚发现在中,属性是的缩写,因此我使用 所以如果有人遇到这个问题,我就把它留在这

  • 假设我们有一个简单的Spring条件,它必须与属性文件中的文件属性相匹配: 不幸的是,上面提到的方法调用都没有返回在属性文件中定义的真实属性。相反,当我为另外两个调用getProperty方法和“${my.property}”字符串时,我得到了null(显然,该属性尚未解析)。

  • 为什么需要这样AddDataType<'AlarmTips'> 才能正确获取类型? 不是已经使用 <T>进行关联了吗?

  • 我有一个bean,我必须自己创建它(使用),它有和注释。 如何让Spring处理我的bean中的这些注释? 相关问题: 在Spring,我可以从自动编织的豆子里自动编织新的豆子吗?

  • 我是Spring的新手,我正在尝试自动连接一个通用DAO。不幸的是,我遇到了一个错误。我试图根据它搜索信息,但大多数解决方案都声明使用@Qualifier注释,我认为这与我想要实现的目标背道而驰。 所以下面的一些代码(我将摆脱类参数,一旦我处理当前问题): 道 服务 和下面抛出的错误:

  • 问题内容: 我正在使用Tire进行elasticsearch。在我的应用程序中,我有2个模型。价格和产品。 我正在尝试搜索我的Price类,并在搜索字段中使用它所属的产品的属性。现在,如果我有一个名为的产品,并输入“ pro”,“ prod”或“ duct”,则没有结果。但是键入“产品”或“产品”会显示结果。我相信问题出在我的地图上。我查看了查询及其: 我认为应该是: 从以下问题 我不知道该如何使