Spring Boot:如何将实现接口的类转换为Bean?
当然可行!把UnitTestContextProvider转为Spring Bean的完整方案
你已经找对方向啦,你的ContextProviders配置类雏形没问题,接下来只需要补全细节,接口相关的部分Spring会帮你自动处理,不用额外操心。
1. 完善你的@Bean配置类
首先把你空的unitTestContext()方法补全,直接返回UnitTestContextProvider的实例就行:
@Configuration public class ContextProviders { @Bean public UnitTestContextProvider unitTestContext() { return new UnitTestContextProvider(); } }
2. 关于接口的处理:Spring自动识别类型
因为UnitTestContextProvider已经实现了MockDataProvider接口,Spring会自动将这个Bean注册为同时具备两种类型的Bean:
- 具体类型:
UnitTestContextProvider - 接口类型:
MockDataProvider
这意味着你在需要注入的时候,有两种选择:
方式一:按具体类型注入
@Autowired private UnitTestContextProvider testContextProvider;
方式二:按接口类型注入(更推荐,符合面向接口编程)
@Autowired private MockDataProvider mockDataProvider;
3. 多实现类场景的额外处理(可选)
如果后续你有多个MockDataProvider的实现类,Spring会不知道该注入哪个,这时候可以用@Qualifier指定Bean名称:
@Autowired @Qualifier("unitTestContext") // 对应你@Bean方法的名称 private MockDataProvider mockDataProvider;
或者直接给@Bean指定自定义名称:
@Bean(name = "unitTestMockProvider") public UnitTestContextProvider unitTestContext() { return new UnitTestContextProvider(); }
4. 在jOOQ测试中使用这个Bean(补充场景)
如果你是要在jOOQ的测试环境中使用这个Mock数据提供者,可以额外配置一个DSLContext Bean,把这个MockProvider传进去:
@Bean public DSLContext dslContext(MockDataProvider mockDataProvider) { return DSL.using(new MockConnection(mockDataProvider), SQLDialect.POSTGRES); }
这样在测试类里注入DSLContext,执行SQL时就会自动触发你的Mock逻辑啦。
内容的提问来源于stack exchange,提问作者VictorGram




