Spring IoC контейнер: настройка бинов, интерфейсы ApplicationContextAware и BeanNameAware

Когда ApplicationContext создает экземпляр объекта, который реализует интерфейс org.springframework.context.ApplicationContextAware, этому экземпляру предоставляется ссылка на этот ApplicationContext. Следующий листинг показывает определение интерфейса ApplicationContextAware:

Java

public interface ApplicationContextAware {

    void setApplicationContext(ApplicationContext applicationContext) throws BeansException;
}

Kotlin

interface ApplicationContextAware {

    @Throws(BeansException::class)
    fun setApplicationContext(applicationContext: ApplicationContext)
}

Таким образом, bean-компоненты могут программно управлять созданным ими ApplicationContext через интерфейс ApplicationContext или путем приведения ссылки на известный подкласс этого интерфейса (такой как ConfigurableApplicationContext, который предоставляет дополнительные функциональные возможности). Одним из применений будет программный поиск других бинов. Иногда эта возможность полезна. Однако в целом этого следует избегать, поскольку он связывает код со Spring и не следует стилю инверсия контроля (Inversion of Control), где соавторы (collaborators) предоставляются компонентам в качестве свойств. Другие методы ApplicationContext обеспечивают доступ к файловым ресурсам, публикацию событий приложения и доступ к MessageSource.

Автопривязка (Autowiring) является еще одной альтернативой для получения ссылки на ApplicationContext. Традиционные конструктор и byType режимы автоматического подключения могут обеспечить зависимость типа ApplicationContext для аргумента конструктора или параметра метода установки, соответственно. Для большей гибкости, включая возможность автоматического подключения полей и методов с несколькими параметрами, используйте функции автоматического подключения на основе аннотаций. В этом случае ApplicationContext автоматически связывается с полем, аргументом конструктора или параметром метода, который ожидает тип ApplicationContext, если рассматриваемое поле, конструктор или метод содержит аннотацию @Autowired.

Когда ApplicationContext создает класс, который реализует интерфейс org.springframework.beans.factory.BeanNameAware, классу предоставляется ссылка на имя, определенное в определении его связанного объекта. В следующем листинге показано определение интерфейса BeanNameAware:

Java

public interface BeanNameAware {

    void setBeanName(String name) throws BeansException;
}

Kotlin

interface BeanNameAware {

    @Throws(BeansException::class)
    fun setBeanName(name: String)
}

Обратный вызов вызывается после заполнения обычных свойств bean-компонента, но до обратного вызова инициализации, такого как InitializingBean, afterPropertiesSet или пользовательского метода init.


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки