您的位置:首页 >依赖注入中如何避免依赖隐藏在有状态对象中
发布于2026-04-13 阅读(0)
扫一扫,手机访问

在 Spring 应用中,若将 AccountValidator 等有状态对象通过 new 实例化而非依赖注入,会导致依赖不可见、难以测试和生命周期失控;正确做法是将其声明为 Spring 管理的 Bean(如 prototype 作用域),并通过 ObjectProvider 按需获取,兼顾可测性、解耦性与线程安全性。
在 Spring 应用中,若将 `AccountValidator` 等有状态对象通过 `new` 实例化而非依赖注入,会导致依赖不可见、难以测试和生命周期失控;正确做法是将其声明为 Spring 管理的 Bean(如 prototype 作用域),并通过 `ObjectProvider` 按需获取,兼顾可测性、解耦性与线程安全性。
在典型的 Spring 构造注入实践中,一个常见反模式是:服务类(如 MyService)内部直接 new AccountValidator(account) —— 这看似简洁,实则将 AccountValidator 的创建逻辑硬编码,造成依赖隐藏(hidden dependency)。该对象虽参与核心业务逻辑(如账户校验),却未出现在构造函数参数中,导致以下问题:
✅ 推荐方案:将 AccountValidator 声明为 Spring Bean,并使用 ObjectProvider 按需获取
Spring 支持多种作用域。对于有状态、需每次调用都获得新实例的验证器,应使用 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE),并配合 ObjectProvider<T> 注入 —— 它是 Spring 5.1+ 推荐的“延迟按需获取 prototype Bean”的安全方式(相比 ApplicationContext.getBean() 更解耦、更测试友好)。
@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class AccountValidator {
private final Account account;
private int validationAttempts = 0; // 示例:有状态字段
public AccountValidator(Account account) {
this.account = Objects.requireNonNull(account);
}
public boolean isValid(Account input) {
validationAttempts++;
return input != null && !input.isBlocked();
}
}
@Service
public class MyService {
private final AuxiliaryService auxiliaryService;
private final ObjectProvider<AccountValidator> validatorProvider; // ✅ 按需获取,非单例持有
public MyService(AuxiliaryService auxiliaryService,
ObjectProvider<AccountValidator> validatorProvider) {
this.auxiliaryService = auxiliaryService;
this.validatorProvider = validatorProvider;
}
public boolean isAccountValid(Account account) {
// 每次调用都获得全新、独立的 AccountValidator 实例
AccountValidator validator = validatorProvider.getObject();
boolean isValid = validator.isValid(account);
if (isValid) {
auxiliaryService.openAccount(account);
}
return isValid;
}
}? 关键优势说明:
⚠️ 注意事项:
综上,将有状态验证器作为 prototype Bean + ObjectProvider 注入,是 Spring 生态下兼顾清晰性、可测性与工程健壮性的标准实践。
上一篇:BS版进销存操作全攻略
下一篇:红果短视频登录失败原因及解决方法
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9