使用工厂设计模式的服务类中的@Autowired存储库

时间:2019-02-02 08:23:35

标签: java spring-boot

我想自动连接由工厂模式初始化的类中的存储库。

让我解释一步一步。

我的存储库类:

@Repository
public class UserRepository {
    //
}

使用存储库类并扩展某些Abstract类的其他类:

public class OtherClass extends AbstractClass {

    @Autowired
    private UserRepository userRepository;

    //
}

现在,我在Factory类上创建了该类,并初始化了OtherClass并放入了一张地图。

@Component
public class TempFactory {
    private final Map<Class, AbstractTest> impletationMap = new HashMap<>();

    @Autowired
    ApplicationContext context;

    @PostConstruct
    public void initialize() {
        populateDataMapperMap(context.getBeansOfType(AbstractTest.class).values().iterator());
    }

    private void populateDataMapperMap(final Iterator<AbstractClass> classIterator) {
        while (classIterator.hasNext()) {
            AbstractTest abstractClassImpl = (AbstractClass) classIterator.next();
            impletationMap.put(abstractClassImpl.getClass(), abstractClassImpl);

        }
    }

}

现在,这里的问题是放在impletationMap中的对象没有自动装配userRepository并返回null。

    Output:

    Otherclass oc = (AbstractClass)impletationMap.get("key")

    userRepository is null in oc object.

我通过This link

来到了这个解决方案

请告诉我如何继续进行。

谢谢。

1 个答案:

答案 0 :(得分:0)

您应该使用@Component注释OtherClass。
我尝试了一下。这是我的代码,希望这可以为您提供帮助。

public class AbstractClass {
}
@Component
public class OtherClass extends AbstractClass {

    @Autowired
    UserRepository userRepository;

    public UserRepository getUserRepository() {
        return userRepository;
    }
}
@Component
public class TempFactory {
    private final Map<Class, AbstractClass> impletationMap = new HashMap<>();

    @Autowired
    ApplicationContext context;

    public Map<Class, AbstractClass> getImpletationMap() {
        return impletationMap;
    }

    @PostConstruct
    public void initialize() {
        populateDataMapperMap(context.getBeansOfType(AbstractClass.class).values().iterator());
    }

    private void populateDataMapperMap(final Iterator<AbstractClass> classIterator) {
        while (classIterator.hasNext()) {
            AbstractClass abstractClassImpl = classIterator.next();
            impletationMap.put(abstractClassImpl.getClass(), abstractClassImpl);
        }
    }

}
@Repository
public class UserRepository {
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/applicationContext.xml")
public class ATest {
    @Autowired
    TempFactory tempFactory;

    @Test
    public void test() {
        OtherClass otherClass = (OtherClass) tempFactory.getImpletationMap().get(OtherClass.class);
        UserRepository userRepository = otherClass.getUserRepository();
        Assert.assertNotNull(userRepository);
    }

}