Spring IoC контейнер: точки расширения контейнера, BeanFactoryPostProcessor

Следующей точкой расширения, на которую мы смотрим, является org.springframework.beans.factory.config.BeanFactoryPostProcessor. Семантика этого интерфейса аналогична семантике BeanPostProcessor, но есть одно существенное отличие: BeanFactoryPostProcessor работает с метаданными конфигурации бина. То есть контейнер IoC Spring позволяет BeanFactoryPostProcessor считывать метаданные конфигурации и, возможно, изменять их до того, как контейнер создаст какие-либо компоненты, кроме экземпляров BeanFactoryPostProcessor.

Вы можете настроить несколько экземпляров BeanFactoryPostProcessor и управлять порядком, в котором эти экземпляры BeanFactoryPostProcessor запускаются, установив свойство order. Однако вы можете установить это свойство, только если BeanFactoryPostProcessor реализует интерфейс Ordered. Если вы пишете свой собственный BeanFactoryPostProcessor, вам следует подумать о реализации интерфейса Ordered.

Если вы хотите изменить фактические экземпляры компонента (то есть объекты, созданные из метаданных конфигурации), вам вместо этого нужно использовать BeanPostProcessor. Хотя технически возможно работать с экземплярами bean-компонентов внутри BeanFactoryPostProcessor (например, с помощью BeanFactory.getBean()), это приводит к преждевременной реализации экземпляров bean, нарушая стандартный жизненный цикл контейнера. Это может вызвать негативные побочные эффекты, такие как обход постобработки бина.

Кроме того, экземпляры BeanFactoryPostProcessor ограничены для каждого контейнера. Это актуально только если вы используете контейнерные иерархии. Если вы определяете BeanFactoryPostProcessor в одном контейнере, он применяется только к определениям компонентов в этом контейнере. Определения bean-компонентов в одном контейнере не подвергаются пост-обработке экземплярами BeanFactoryPostProcessor в другом контейнере, даже если оба контейнера являются частью одной иерархии.

Постпроцессор фабрики бинов автоматически выполняется, когда он объявлен внутри ApplicationContext, чтобы применить изменения к метаданным конфигурации, которые определяют контейнер. Spring включает в себя несколько предопределенных постпроцессоров фабрики бинов, таких как PropertyOverrideConfigurer и PropertySourcesPlaceholderConfigurer. Вы также можете использовать пользовательский BeanFactoryPostProcessor - например, для регистрации пользовательских редакторов свойств.

ApplicationContext автоматически обнаруживает любые развернутые в нем bean-компоненты, которые реализуют интерфейс BeanFactoryPostProcessor. Эти бины используются в качестве постпроцессоров фабрики бинов в соответствующее время. Вы можете развернуть эти bean-компоненты постпроцессора так же, как и любой другой bean-компонент.

Как и в случае с BeanPostProcessors, вы обычно не хотите настраивать BeanFactoryPostProcessors для отложенной инициализации (lazy initialization). Если никакой другой компонент не ссылается на Bean(Factory)PostProcessor, этот постпроцессор вообще не будет создан. Таким образом, маркировка для отложенной инициализации будет проигнорирована, и экземпляр Bean(Factory)PostProcessor будет создан сразу (eager), даже если вы установите для атрибута default-lazy-init значение true в объявлении элемента <beans/>.


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


Комментарии

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

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

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

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