@Autowired репозиторий в классе обслуживания с использованием Factory Design Pattern - PullRequest
0 голосов
/ 02 февраля 2019

Я хочу автоматически связать репозиторий в классе, который инициализируется фабричным шаблоном.

Позвольте мне объяснить шаг за шагом.

Мой класс репозитория:

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

        }
    }

}

Теперь проблемавот тот объект, который помещен в ImplementMap, не автоматически связывает userRepository и возвращает ноль.

    Output:

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

    userRepository is null in oc object.

Я пришел к этому решению Эта ссылка

Скажите, пожалуйста, какпродолжить.

Спасибо.

1 Ответ

0 голосов
/ 02 февраля 2019

Вы должны аннотировать OtherClass с помощью @Component.И у меня была попытка. Вот мой код, надеюсь, это поможет вам.

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...