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.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ