Java 基于构造函数参数的条件@Autowired
我是spring新手,正在尝试重构一些代码,我有以下“Session.class”: 我读到使用context.getBean()是一种不好的做法,会使类变得不稳定。Java 基于构造函数参数的条件@Autowired,java,spring,Java,Spring,我是spring新手,正在尝试重构一些代码,我有以下“Session.class”: 我读到使用context.getBean()是一种不好的做法,会使类变得不稳定。 根据上述内容,连接currentWallet的正确方法是什么?创建一个接口Wallet,并创建实现类,如SOAPExternalWallet,JSONExternalWallet,GuestWallet。 创建一个工厂类,然后根据类型从工厂类返回正确的实现 注入这三个值,然后根据商户类型选择要使用的值今天我有3个,但是如果明天我有
根据上述内容,连接currentWallet的正确方法是什么?创建一个接口
Wallet
,并创建实现类,如SOAPExternalWallet
,JSONExternalWallet
,GuestWallet
。创建一个工厂类,然后根据类型从工厂类返回正确的实现 注入这三个值,然后根据商户类型选择要使用的值今天我有3个,但是如果明天我有12个类型,将它们全部连接起来不是浪费吗?虽然我很喜欢这个解决方案,但它将是最容易实现的。实际上,您依赖的是
Wallet
类,而不是sessionId
,所以这是您在构造函数中应该实现和期望的。根据系统其余部分的定义方式,您可以有一个钱包原型bean,它的创建取决于令牌,而令牌又取决于会话ID。但是我不使用spring,我希望currentWallet字段以某种方式被@autowired…请看我的答案
public class Session {
...
private Wallet currenetWallet;
...
public Session(..., int sessionId, ...) {
...
ThirdPartyToken token = context.getBean(ThirdPartyTokenDAO.class).getThirdPartyToken(sessionId);
if (token.getExternalUser().getMerchant().getType().equals("SOAPMerchant")) {
currenetWallet = (Wallet) context.getBean("SOAPExternalWallet", token);
}
else if (token.getExternalUser().getMerchant().getType().equals("JSONMerchant")) {
currenetWallet = (Wallet) context.getBean("JSONExternalWallet", token);
}
else {
currenetWallet = (Wallet) context.getBean("GuestWallet", 1000.0);
}
...
}
}