DI на основе сеттера (setter) выполняется путем вызова контейнером сеттеров для бинов после вызова конструктора без аргументов или статического
фабричного метода без аргументов для создания экземпляра бина.
В следующем примере показан класс, зависимость в который может быть внедрена исключительно через сеттер. Данный класс является обычным Java-классом. Это POJO (простой объект языка Java), который не зависит от конкретных интерфейсов контейнера, базовых классов или аннотаций.
public class SimpleMovieLister {
// SimpleMovieLister зависит от MovieFinder
private MovieFinder movieFinder;
// сеттер, позволяющий контейнеру Spring внедрить MovieFinder
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// бизнес-логика, которая фактически использует внедренный MovieFinder, опущена...
}
class SimpleMovieLister {
// свойство с отложенной инициализацией, которое позволяет контейнеру Spring внедрить MovieFinder
lateinit var movieFinder: MovieFinder
// бизнес-логика, которая фактически использует внедренный MovieFinder, опущена...
}
ApplicationContext
поддерживает DI на основе конструктора и на основе сеттера для бинов, которыми он управляет. Он также поддерживает DI на основе сеттера после того, как некоторые зависимости уже внедрены с помощью подхода с использованием конструктора. Вы настраиваете зависимости в виде BeanDefinition
, которые используете вместе с экземплярами PropertyEditor
для преобразования свойств из одного формата в другой. Однако большинство пользователей Spring работают с этими классами не напрямую (то есть программно), а с XML-определениями bean
, аннотированными компонентами (то есть классами, помеченными аннотациями @Component
, @Controller
и так далее) или методами, помеченными аннотацией @Bean
, в классах, помеченных аннотацией @Configuration
, на основе Java. Эти источники затем внутренне преобразуются в экземпляры BeanDefinition
и используются для загрузки всего экземпляра IoC-контейнера Spring.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ