#java #spring
#java #spring
Вопрос:
У меня есть одноэлементный класс ReadingStratgeyImp
, который расширяется из интерфейса ReadingStrategy
. In readingStrategyImp-getInstance()
метод вернет экземпляр ReadingStrategyImp
.
Вот мой запрос: я хочу внедрить зависимость ReadingStrategyImp
в несколько других классов проекта. Я добиваюсь этого с помощью приведенного ниже кода
ReadingStrategy readingStrategy;
@Autowired
public void setReadingStrategy(ReadingStrategyImp readingStrategy) {
this.readingStrategy = ReadingStrategyImp.getInstance();
}
Я хочу знать, как можно внедрить зависимость.
Ответ №1:
Вы просто делаете это :
@Component
public class Sample {
// spring will automatically find the implementation class and inject it.
// so, the ReadingStrategyImp class will automatically injected.
@Autowired
@Qualifier("readingStrategyImp")
private ReadingStrategy readingStrategy;
}
Вот и все.
Комментарии:
1. Если есть два класса, которые реализуют ReadingStrategy, мне нужны отдельные экземпляры реализованных классов. Как это может помочь в достижении того же?
2. @RiaSachdeva Вы должны использовать
@Qualifier
для этого. Скажите мне имя класса, которое вы должны ввести. Я отредактирую свой ответ.3. Я попробовал один, но он не работает, если класс является одноэлементным.
4. Я могу внедрить зависимость, но я хочу получить доступ к тому же экземпляру, что и класс, который является одноэлементным. Здесь проблема заключается в том, что каждый раз, когда я автоматически подключаю его, создается новый экземпляр этого компонента. Отредактирует код со структурой программы и результатами.
5. @RiaSachdeva Нет !! При автоматическом подключении новый экземпляр не создается. В контейнере IOC компоненты создаются при запуске, и эти компоненты являются одноэлементными по своей природе. Итак, вы вводите только одноэлементный компонент.
Ответ №2:
Если я правильно понимаю ваш вопрос, вы должны сначала создать компонент для ReadingStrategy с помощью ReadingStrategyImp:
@Bean
public ReadingStrategy readingStrategy() {
return ReadingStrategyImp.getInstance();
}
Тогда вы могли бы просто автоматически подключить ReadingStrategy там, где вам это нужно.
@Autowired ReadingStrategy readingStrategy;
Всегда лучше зависеть от интерфейсов, а не от конкретных классов.