[英]@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.