gpt4 book ai didi

java - 我应该如何将依赖项注入(inject)到 Mybatis 实例化的不可变域对象中?

转载 作者:太空宇宙 更新时间:2023-11-04 11:06:22 25 4
gpt4 key购买 nike

我正在开发一个 Spring Boot 应用程序并使用 Mybatis。为了保证Mybatis实例化的对象的不变性,我让Mybatis使用<constructor>而不是使对象可变的 setter。与其他序数对象一样,这些 Mybatis 实例化的对象需要依赖关系来完成其职责,而这些依赖关系有时是由 Spring 实例化的 bean。

如果一个对象是由 Spring 实例化的,那么很容易向它注入(inject)依赖项。但是Mybatis实例化的对象显然是在Spring的DI容器之外的,你不能使用 @Autowired或其他 Spring 机制来注入(inject)其依赖项。

当然,我可以在 Mybatis 实例化后手动注入(inject)依赖项,例如:

DomainA d = DomainAMapper.fetchOne();
d.setDependency(dependency);

但这破坏了 DomainA 的不变性.

如何满足我的需求,即向 Mybatis 实例化对象注入(inject)依赖项,同时保持其不变性?

最佳答案

如果您对当前的设计感到满意并且专注于测试,那么 PowerMockit 应该满足您的需求,因为它能够“设置/模拟”私有(private)成员。

示例:

@Component
public class DomainA {
@Autowired
private ApplicationContext context;
public boolean isContextInitilized() {
return context != null;
}
}
<小时/>
import org.powermock.api.support.membermodification.MemberModifier;
...
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
@Autowired
ApplicationContext contextToInject;
@Autowired
DomainA domainAAutowired;

@Test
public void contextLoads() throws IllegalArgumentException, IllegalAccessException {
// Autowired spring beans work fine
assertTrue(domainAAutowired.isContextInitilized());
// Class out of spring context won't initialize dependencies
DomainA domainOutOfSpringContext = new DomainA();
assertFalse(domainOutOfSpringContext.isContextInitilized());
// We can 'set' private members using PowerMock
MemberModifier.field(DomainA.class, "context").set(domainOutOfSpringContext, contextToInject);
assertTrue(domainOutOfSpringContext.isContextInitilized());
}
}

顺便说一句,MyBatis 类应该是简单的 POJO。 MyBatis 中存在 spring 依赖项可能表明关注点分离不佳,因为它们应该只关注持久层。

关于java - 我应该如何将依赖项注入(inject)到 Mybatis 实例化的不可变域对象中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46438532/

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