Как определить List бин в Spring и инжект его в классы
Быстрый ответ
@Bean
public List<String> myList() {
return Arrays.asList("яблоко", "банан", "вишня");
}
Всё просто и очевидно: метод с аннотацией @Bean
создаёт список с фиксированным набором строк в Spring-конфигурации.
JavaConfig, Автопроводка и Порядок
Управление вашими бинами
Допустим, у вас есть сложный Spring-проект, в котором сервисы A и B разбросаны по разным углам. Вам помогут два инструмента:
- Autowired: Он отслеживает автосвязывания и настраивает связи в соответствии с вашими потребностями.
- Order: Он определяет порядок инициализации бинов.
@Configuration
public class AppConfig {
@Autowired
private ServiceA serviceA;
@Autowired
private ServiceB serviceB;
@Bean
@Order(1)
public String serviceAName() {
return serviceA.getName();
}
@Bean
@Order(2)
public String serviceBName() {
return serviceB.getName();
}
@Bean
public List<String> serviceNames() {
return Arrays.asList(serviceAName(), serviceBName());
}
}
Списки, инжектированные Spring-ом, и динамически упакованные
Также как и разные сорта кофе, бины в списке могут быть различными. В этом случае нам на помощь приходит Spring Expression Language (EL), позволяющий формировать списки динамически.
@Bean
public List<String> dynamicList() {
return new ArrayList<>(Arrays.asList(
"#{serviceA.getName()}",
"#{serviceB.getDescription()}"
));
}
Создавайте список именно под свои задачи, способный меняться на ходу.
Неизменяемые списки: защита бинов
Чтобы наши списки не менялись неожиданно, используйте Collections.unmodifiableList()
. Другой вариант — создать всегда новый список с помощью Lists.newArrayList()
от Google Guava.
@Bean
public List<String> immutableGenreList() {
return Collections.unmodifiableList(Arrays.asList("Научная фантастика", "Фэнтези", "Детектив"));
}
Оставляйте некоторые вещи неизменяемыми, как секрет старой бабушки.
XML способ: util:list
XML альтернатива
Людям, предпочитающим конфигурацию XML, Spring предоставляет поддержку через <util:list>
.
<util:list id="myList" value-type="java.lang.String">
<value>яблоко</value>
<value>банан</value>
<value>вишня</value>
</util:list>
Атрибут value-type
обеспечивает то, что содержимое списка всегда будет строковым.
Ссылки: Вкладывание бинов друг в друга
Элемент ref
позволяет включать один бин в списки других бинов.
<util:list id="myServiceList" list-class="java.util.ArrayList">
<ref bean="serviceA"/>
<ref bean="serviceB"/>
</util:list>
Правильное применение свойств и аннотаций
Необходимые аннотации
Используйте аннотацию @Required
, чтобы указать, что свойство обязательно должно быть настроено. Не забудьте о сеттере!
public class SomeClass {
private List<String> жанры;
@Required
public void setGenres(List<String> жанры) {
this.жанры = жанры;
}
}
Списки с внешней конфигурацией
Применяйте @Value
для инъектирования свойств из внешних источников.
@Bean
public List<String> externalConfiguredList(@Value("${жанры.список}") String[] жанры) {
return Arrays.asList(жанры);
}
Внешняя конфигурация делает бины гибкими и динамичными.
Визуализация
Представьте себе место для хранения книг с разделами для любимых жанров.
@Configuration
public class AppConfig {
@Bean
public List<String> myFavoriteGenres() {
return Arrays.asList("Научная фантастика", "Фэнтези", "Детектив");
}
}
Используйте такие классы в вашем приложении Spring, как будто они – книги на полке.
@Autowired
private List<String> myFavoriteGenres;
Риски и их решения
Контролируемый хаос списков
Порядок элементов в списке важен. И его можно установить, применив @Order
.
@Order(1)
@Bean
public Book thrillerBook() {
return new Book("Триллер");
}
Ни одного клонирования больше
Можно обеспечить уникальность элементов списков с помощью Set
или проверки бинов на этапе их создания.
@Autowired
private Set<Book> books;
Полезные материалы
- Документация по Spring Framework – Определения Бинов — официальная документация Spring.
- Руководство Baeldung – Определение List Bean в Spring — практическое руководство по определению и иньекции list бинов.
- Обсуждение на StackOverflow – Создание List бинов в Spring — обсуждение о list бинах.
- Инжектирование коллекций в Spring – Учебник — учебное пособие по инжекции коллекций.
- Определение области видимости бина в Spring – Singleton против Prototype — руководство по использованию областей видимости бинов.