Как определить компонент списка весной?
Я использую Spring для определения этапов моего приложения. Он настроен на то, что необходимый class (здесь называется Configurator
) вводится этапами.
Теперь мне нужен список этапов в другом classе с именем LoginBean
. Configurator
не предоставляет доступ к его списку этапов.
Я не могу изменить Configurator
classов.
Моя идея:
Определите новый bean-компонент под названием Stages и введите его в Configurator
и LoginBean
. Моя проблема с этой идеей заключается в том, что я не знаю, как преобразовать это свойство:
- Доступ к весенним бобам из сервлета в JBoss
- Как принять параметры даты в запросе GET на Spring MVC Controller?
- Spring RedirectAttributes: addAttribute () vs addFlashAttribute ()
- Как запустить приложение Spring-Boot без зависимости от базы данных?
- Метод @Transactional, вызванный из другого метода, не получает транзакции
... ... ...
в фасоль.
Что-то вроде этого не работает:
Может ли кто-нибудь помочь мне в этом?
- Передача нескольких переменных в @RequestBody controllerу Spring MVC с использованием Ajax
- java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession () Lorg / hibernate / classic / Session
- как получить параметр в методе post spring mvc?
- Больше нет данных для чтения из ошибки сокета
- Определение пространств имен Spring JAXB без использования NamespacePrefixMapper
- Пользовательский HttpMessageConverter с @ResponseBody, чтобы делать вещи Json
- Как правильно использовать PagedResourcesAssembler из Spring Data?
- Как добиться условного импорта ресурсов в контексте Spring XML?
Импортируйте пространство имен spring util. Затем вы можете определить список компонентов следующим образом:
foo bar
Тип значения – это тип генериков, который будет использоваться, и является необязательным. Вы также можете указать class реализации списка, используя class list-class
атрибутов.
Другой вариант – использовать JavaConfig. Предполагая, что все этапы уже зарегистрированы как весенние бобы, вам просто нужно:
@Autowired private List stages;
и весна автоматически введет их в этот список. Если вам нужно сохранить порядок (верхнее решение этого не делает), вы можете сделать это следующим образом:
@Configuration public class MyConfiguration { @Autowired private Stage1 stage1; @Autowired private Stage2 stage2; @Bean public List stages() { return Lists.newArrayList(stage1, stage2); } }
Другим решением для сохранения порядка является аннотация @Order
для bean-компонентов. Затем список будет содержать бины, упорядоченные по возрастанию значения annotations.
@Bean @Order(1) public Stage stage1() { return new Stage1(); } @Bean @Order(2) public Stage stage2() { return new Stage2(); }
Штабелер дал отличный ответ, я бы сделал шаг дальше, чтобы сделать его более динамичным и использовать Spring 3 EL Expression.
#{springDAOBean.getGenericListFoo()}
Я пытался выяснить, как это сделать с помощью списка util: list, но не смог заставить его работать из-за ошибок преобразования.
Я думаю, вы можете искать org.springframework.beans.factory.config.ListFactoryBean
.
Вы объявляете экземпляр ListFactoryBean, предоставляя список, который должен быть создан как свойство с элементом
качестве его значения, и присваивать компоненту атрибут id
. Затем каждый раз, когда вы используете объявленный id
как ref
или аналогичный в каком-либо другом объявлении bean, создается новая копия списка. Вы также можете указать class List
который будет использоваться.
Используйте пространство имен util, вы сможете зарегистрировать этот список в виде компонента в контексте вашего приложения. Затем вы можете повторно использовать список, чтобы ввести его в другие определения bean-компонентов.
В дополнение к ответу Якуба, если вы планируете использовать JavaConfig, вы также можете автоустанавливать этот путь:
import com.google.common.collect.Lists; import java.util.List; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Bean; <...> @Configuration public class MyConfiguration { @Bean public List stages(final Stage1 stage1, final Stage2 stage2) { return Lists.newArrayList(stage1, stage2); } }