如何将非Spring管理类注入@Service,通过@Autowired/构造注入便于测试
结论
你给出的配置类写法完全可行,这是Spring中将非Spring托管的外部对象纳入IoC容器管理的标准实现方案。
原理说明
@Configuration 类中标记了@Bean的方法,会将返回的对象注册为Spring容器中的Bean,默认作用域为单例,和你原有DaoProvider.getMyDao()返回静态实例的生命周期完全匹配,不需要修改其他业务逻辑,就能直接通过@Autowired或者构造器注入使用。
这种改造方式刚好可以解决你提到的单元测试痛点:不需要再Mock静态方法,测试时直接通过@MockBean注解替换容器中MyDao类型的Bean即可,不会增加构建流水线的耗时。
可选优化点
- 优先使用构造器注入替代字段
@Autowired注入,Spring 4.3+版本中,如果@Service类只有一个有参构造方法,且构造方法参数对应的Bean已在容器中存在,不需要额外加@Autowired注解就能自动注入,代码更简洁,也方便单测时手动传入Mock实例
示例代码如下:
@Service public class MyService { private final MyDao myDao; public MyService(MyDao myDao) { this.myDao = myDao; } public void foo() { myDao.bar(); // 其他业务逻辑 } }
- 如果存在同类型多个Bean的场景,可以在
@Bean注解上指定Bean名称,比如@Bean("myDao")避免注入冲突 - 如果
DaoProvider.getMyDao()返回的实例是非线程安全的,可以给@Bean方法添加@Scope("prototype")注解调整为多例作用域,每次注入时都会重新调用方法获取新实例
内容的提问来源于stack exchange,提问作者katana0815
相关产品推荐
相关产品推荐

