简体   繁体   English

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

[英]@Autowired repository in service class with use of Factory Design Pattern

I want to autowire repository in class which is initialized by factory pattern. 我想自动连接由工厂模式初始化的类中的存储库。

Let me explain step by step. 让我逐步解释。

My repository class: 我的存储库类:

@Repository
public class UserRepository {
    //
}

Other class that uses the repository class and extend some Abstract class: 使用存储库类并扩展某些Abstract类的其他类:

public class OtherClass extends AbstractClass {

    @Autowired
    private UserRepository userRepository;

    //
}

Now I have created on Factory class which Initialized this OtherClass and put in one map. 现在,我在Factory类上创建了此InitialClass并对其进行了初始化,并放入了一张地图。

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

        }
    }

}

Now the problem here is that object which put in impletationMap is not autowire the userRepository and return null. 现在,这里的问题是放在impletationMap中的对象没有自动装配userRepository并返回null。

    Output:

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

    userRepository is null in oc object.

I come to this solution by This link 我通过这个链接来解决这个问题

Please tell me how to proceed further. 请告诉我如何继续进行。

Thank You. 谢谢。

you should annotate OtherClass with @Component. 您应该使用@Component注释OtherClass。
And i had a try.here is my code,hope this could help you. 我尝试了一下。这是我的代码,希望这对您有所帮助。

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

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM