代码之家  ›  专栏  ›  技术社区  ›  user6344468

我应该如何向Mybatis实例化的不可变域对象注入依赖关系?

  •  1
  • user6344468  · 技术社区  · 8 年前

    我正在开发一个Spring Boot应用程序,并使用Mybatis。为了确保Mybatis实例化的对象的不变性,我让Mybatis使用 <constructor>

    如果一个对象由Spring实例化,则很容易向其注入依赖项。但是由Mybatis实例化的对象显然来自Spring的DI容器,您不能使用 @Autowired 或其他弹簧力学来注入其依赖性。

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

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

    DomainA .

    1 回复  |  直到 8 年前
        1
  •  0
  •   Rafa    8 年前

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

    例子:

    @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());
        }
    }
    

    推荐文章