gpt4 book ai didi

java - 在运行时更改 Spring bean 实现

转载 作者:行者123 更新时间:2023-12-05 01:23:43 24 4
gpt4 key购买 nike

我有一个接口(interface)和多个实现。我在类中自动连接接口(interface)以供使用。我需要在运行时选择不同的实现。

public class Util {
public void getClient();
}

实现

public class UtilOne implements Util {
public void getClient() {...}
}

public class UtilTwo implements Util {
public void getClient() {...}
}

@Configuration
public class AppConfig {

@Autowired
@Bean
@Primary
public Util utilOne() {
return new UtilOne();
}

@Autowired
@Bean
public Util utilTwo() {
return new UtilTwo();
}

}
@Component
public class DemoService {

@Autowired
private Util util;
}

出于某种原因,如果我们无法在 UtilOne 中获取客户端,我想在不重新启动应用程序的情况下切换到 UtilTwo。我想将 DemoService 中的 Util 对象更改为 UtilTwo 对象。属性 active.util 将来自数据库,我们可以从 UI 更新吗?

最佳答案

这种方式行不通 - 如果您将 Util 的某个实现连接到 SampleClass 类(它是一个单例),您就无法在不重新启动应用程序的情况下真正将 Util 的实现更改为不同的东西上下文。

因此,我建议不要采用这种方式,而是另一种选择。您说在运行时评估的某些条件下您想要切换实现。这是一种什么样的状态?是否可以提取这个条件判定逻辑?

如果是这样,您可以 Autowiring 一个特殊的 DynamicUtil,它将保存对所有实用程序的引用,并将根据条件调用所需的实用程序:

// represents all possible business 'runtime' outcomes
enum ConditionOutcome {
A, B, C
}
interface ConditionEvaluator {
ConditionOutcome evaluate(); // when called in runtime will evaluate a condition that currently exists in the system
}

interface Util {
void foo();
ConditionOutcome relevantOfOutcome();
}

class Utill1Impl implements Util {
public void foo() {...}
public ConditionOutcome relevantOfOutcome() {return ConditionOutcome.A;}
}
class Utill2Impl implements Util {
public void foo() {...}
public ConditionOutcome relevantOfOutcome() {return ConditionOutcome.B;}
}
class Utill3Impl implements Util {
public void foo() {...}
public ConditionOutcome relevantOfOutcome() {return ConditionOutcome.C;}
}

class DynamicUtil {
private final Map<ConditionOutcome, Util> possibleImpls;
private final ConditionEvaluator evaluator;

public class DynamicUtil(List<Util> allImplementations, ConditionEvaluator evaluator) {
// create a map by calling the 'relevantOfOutcome' per util impl in a loop
this.evaluator = evaluator;
}

public void foo() {
ConditionOutcome key = evaluator.evaluate();
// pick the relevant implementation based on evaluated key
possibleImpls.get(key).foo();
}
}

现在有了这样的设计,您可以动态添加新的可能结果(以及应该实现它们的实用程序。您系统中的类将不得不 Autowiring DynamicUtil,因此您将有效地引入一个额外的间接级别,但将获得灵 active

class SampleClass { // a business class that will need to work with util capable of being changed during the runtime 
@Autowired
private DynamicUtil util;
...
}

关于java - 在运行时更改 Spring bean 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71994792/

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