Как определить List бин в Spring и инжект его в классы

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Java
Скопировать код
@Bean
public List<String> myList() {
    return Arrays.asList("яблоко", "банан", "вишня");
}

Всё просто и очевидно: метод с аннотацией @Bean создаёт список с фиксированным набором строк в Spring-конфигурации.

Кинга Идем в IT: пошаговый план для смены профессии

JavaConfig, Автопроводка и Порядок

Управление вашими бинами

Допустим, у вас есть сложный Spring-проект, в котором сервисы A и B разбросаны по разным углам. Вам помогут два инструмента:

  • Autowired: Он отслеживает автосвязывания и настраивает связи в соответствии с вашими потребностями.
  • Order: Он определяет порядок инициализации бинов.
Java
Скопировать код
@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), позволяющий формировать списки динамически.

Java
Скопировать код
@Bean
public List<String> dynamicList() {
    return new ArrayList<>(Arrays.asList(
        "#{serviceA.getName()}",
        "#{serviceB.getDescription()}"
    ));
}

Создавайте список именно под свои задачи, способный меняться на ходу.

Неизменяемые списки: защита бинов

Чтобы наши списки не менялись неожиданно, используйте Collections.unmodifiableList(). Другой вариант — создать всегда новый список с помощью Lists.newArrayList() от Google Guava.

Java
Скопировать код
@Bean
public List<String> immutableGenreList() {
    return Collections.unmodifiableList(Arrays.asList("Научная фантастика", "Фэнтези", "Детектив"));
}

Оставляйте некоторые вещи неизменяемыми, как секрет старой бабушки.

XML способ: util:list

XML альтернатива

Людям, предпочитающим конфигурацию XML, Spring предоставляет поддержку через <util:list>.

xml
Скопировать код
<util:list id="myList" value-type="java.lang.String">
    <value>яблоко</value>
    <value>банан</value>
    <value>вишня</value>
</util:list>

Атрибут value-type обеспечивает то, что содержимое списка всегда будет строковым.

Ссылки: Вкладывание бинов друг в друга

Элемент ref позволяет включать один бин в списки других бинов.

xml
Скопировать код
<util:list id="myServiceList" list-class="java.util.ArrayList">
    <ref bean="serviceA"/>
    <ref bean="serviceB"/>
</util:list>

Правильное применение свойств и аннотаций

Необходимые аннотации

Используйте аннотацию @Required, чтобы указать, что свойство обязательно должно быть настроено. Не забудьте о сеттере!

Java
Скопировать код
public class SomeClass {
    private List<String> жанры;

    @Required
    public void setGenres(List<String> жанры) {
        this.жанры = жанры;
    }
}

Списки с внешней конфигурацией

Применяйте @Value для инъектирования свойств из внешних источников.

Java
Скопировать код
@Bean
public List<String> externalConfiguredList(@Value("${жанры.список}") String[] жанры) {
    return Arrays.asList(жанры);
}

Внешняя конфигурация делает бины гибкими и динамичными.

Визуализация

Представьте себе место для хранения книг с разделами для любимых жанров.

Java
Скопировать код
@Configuration
public class AppConfig {
    @Bean
    public List<String> myFavoriteGenres() {
        return Arrays.asList("Научная фантастика", "Фэнтези", "Детектив");
    }
}

Используйте такие классы в вашем приложении Spring, как будто они – книги на полке.

Java
Скопировать код
@Autowired
private List<String> myFavoriteGenres;

Риски и их решения

Контролируемый хаос списков

Порядок элементов в списке важен. И его можно установить, применив @Order.

Java
Скопировать код
@Order(1)
@Bean
public Book thrillerBook() {
    return new Book("Триллер");
}

Ни одного клонирования больше

Можно обеспечить уникальность элементов списков с помощью Set или проверки бинов на этапе их создания.

Java
Скопировать код
@Autowired
private Set<Book> books;

Полезные материалы

  1. Документация по Spring Framework – Определения Бинов — официальная документация Spring.
  2. Руководство Baeldung – Определение List Bean в Spring — практическое руководство по определению и иньекции list бинов.
  3. Обсуждение на StackOverflow – Создание List бинов в Spring — обсуждение о list бинах.
  4. Инжектирование коллекций в Spring – Учебник — учебное пособие по инжекции коллекций.
  5. Определение области видимости бина в Spring – Singleton против Prototype — руководство по использованию областей видимости бинов.