gpt4 book ai didi

java - 如何在 Spring @Condition 类中 Autowiring 一个 bean

转载 作者:行者123 更新时间:2023-12-05 03:19:57 24 4
gpt4 key购买 nike

我有一个如下所示的接口(interface) IInterface.java:

public interface IInterface {
void printIt();
}

为此有两个实现类:ImplementationA.javaImplementationB.java

@Component
public class ImplementationA implements IInterface {
@Override
public void printIt() {
System.out.println("Inside ImplementationA");
}
}

@Component
public class ImplementationB implements IInterface {
@Override
public void printIt() {
System.out.println("Inside ImplementationB");
}
}

现在我有一个监听器类,它有这个 IInterface 作为成员:

@Component
@AllArgsConstructor
public class Listener {

IInterface iInterface;

public void doStuff(){
iInterface.printIt();
}
}

现在,我的要求是在Listener 的iInterface 成员中注入(inject)ImplementationA.javaImplementationB.java。 java 基于一定的条件。

经过一些研究,我开始使用 @Conditional 注释。我添加了两个类 ConditionA.javaConditionB.java:

public class ConditionA implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return false;
}
}
public class ConditionB implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return true;
}
}

而且我还如下更改了我的实现类(添加了 Conditional 注释):

@Component
@Conditional(ConditionA.class)
public class ImplementationA implements IInterface {
@Override
public void printIt() {
System.out.println("Inside ImplementationA");
}
}

@Component
@Conditional(ConditionB.class)
public class ImplementationB implements IInterface {
@Override
public void printIt() {
System.out.println("Inside ImplementationA");
}
}

这对我来说似乎很有魅力。无论我需要注入(inject)哪个实现类,我只需从其相应的 Condition 类返回 true 并从实现类的其余 Condition 返回 false 类。

然而,下一部分是我面临的挑战:因此,根据上述解决方案,我从相应的 Conditionmatches 方法中对 return truereturn false 进行了硬编码> 类。如果我需要返回基于另一个组件的动态值怎么办。

假设我有一个 spring ComponentMyCustomConfig,它有一个成员 customFlag,如果这个成员设置为 true,我们需要注入(inject) ImplementationA.class。我尝试了下面的方法(创建了 @Component 类并自动连接了 MyCustomConfig):

@Component
public class ConditionA implements Condition {
@Autowired
MyCustomConfig myCustomConfig;

@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return myCustomConfig.getCustomFlag();
}
}

然而,这根本行不通。 myCustomConfig 没有 Autowiring ,我得到一个空指针异常。

有人可以帮我解决这个问题吗

最佳答案

我认为使用 implements Condition 不可能满足您的需求。

如果您检查 documentation对于 interface Condition 这是你提供给 @Conditional 的类应该做的,在你的情况下 ConditionAConditionB 它说:

Conditions must follow the same restrictions asBeanFactoryPostProcessor and take care to never interact with beaninstances. For more fine-grained control of conditions that interactwith @Configuration beans consider implementing theConfigurationCondition interface.

也许这个answer会为您提供一个解决方法,正如上面在文档中提到的那样,如果您想干扰其他 bean,您应该实现自己的自定义 ConfigurationCondition。

只需检查此 ConfigurationCondition 运行的阶段是否在您需要的 bean 注册之后

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

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