【问题标题】:@Autowired repository in service class with use of Factory Design Pattern使用工厂设计模式的服务类中的@Autowired 存储库
【发布时间】:2019-02-02 08:23:35
【问题描述】:

我想在由工厂模式初始化的类中自动装配存储库。

让我一步一步解释。

我的存储库类:

@Repository
public class UserRepository {
    //
}

使用存储库类并扩展一些抽象类的其他类:

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来解决这个问题

请告诉我下一步该怎么做。

谢谢。

【问题讨论】:

    标签: java spring-boot


    【解决方案1】:

    你应该用@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);
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2016-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多