В чем разница между BeanPostProcessor и методом init/destroy в Spring? - программирование
Подтвердить что ты не робот

В чем разница между BeanPostProcessor и методом init/destroy в Spring?

В чем разница между реализацией интерфейса BeanPostProcessor и использованием атрибутов метода init/destroy в файле конфигурации XML в Spring или реализации интерфейса InitializingBean/DisposableBean?

4b9b3361

Ответ 1

Это довольно четко объяснено в документации Spring о Точки расширения контейнера.

Интерфейс BeanPostProcessor определяет методы обратного вызова, которые вы можете реализовать, чтобы предоставить свой собственный (или переопределить контейнер по умолчанию) логика создания экземпляра, логика зависимостей и т.д. если ты хотите реализовать некоторую пользовательскую логику после контейнера Springзавершает создание экземпляра, настройку и инициализацию bean, вы можете подключите одну или несколько реализаций BeanPostProcessor.

Таким образом, по существу метод postProcessBeforeInitialization, определенный в BeanPostProcessor, вызывается (как указывает имя) перед инициализацией beans, а также после вызова postProcessAfterInitialization после инициализации bean.

Разница в методах @PostConstruct, InitializingBean и custom init заключается в том, что они определены в самой bean. Их упорядочение можно найти в разделе Сочетание механизмов жизненного цикла в документации Spring.

Таким образом, в основном BeanPostProcessor может использоваться для создания пользовательской логики создания экземпляра для нескольких beans, если другие определены на основе bean.

Ответ 2

В ответах четко объясняется один из очень важных аспектов.

Кроме того, важно понимать, что оба метода beanPostProcessor и init и destroy являются частью жизненного цикла Spring bean.

Класс BeanPostProcessor имеет два метода.

1) postProcessBeforeInitialization - поскольку имя ясно говорит, что оно использовалось для проверки необходимых действий перед инициализацией. например вы хотите загрузить определенный файл свойств/прочитать данные из удаленного источника/службы.

2) postProcessAfterInitialization - любая вещь, которую вы хотите сделать после инициализации до bean ссылка на приложение.

Последовательность опрошенных методов в жизненном цикле следующим образом:

1) BeanPostProcessor.postProcessBeforeInitialization()

2) init()

3) BeanPostProcessor.postProcessAfterInitialization()

4) destroy()

Вы можете проверить это, написав простой пример с sysout и проверить их последовательность.

Ответ 3

BeanPostProcessor. BeanPostProcessor дает вам возможность обработать экземпляр bean, созданный контейнером IoC после его создания, а затем снова после возникновения события инициализации в экземпляре. Вы можете использовать это, чтобы обрабатывать поля, которые были установлены, выполнять проверку на bean или даже искать значения из удаленного ресурса для установки на bean по умолчанию.

BeanPostProcessors и любой из beans, от которых они зависят, создаются перед любым другим beans в контейнере. После того, как они создаются и упорядочиваются, они используются для обработки всех остальных beans, поскольку они создаются контейнером IoC. Spring различные прокси AOP для кэширования, транзакций и т.д. все применяются BeanPostProcessors. Таким образом, любой созданный вами BeanPostProcessor не подходит для прокси-серверов AOP. Поскольку прокси-серверы AOP применяются таким образом, возможно, прокси-сервер AOP еще не был применен к экземпляру, поэтому следует проявлять осторожность, если это повлияет на выполнение любой последующей обработки.

метод init/destroy. В Spring вы можете использовать метод init-method и destroy-method в качестве атрибута в bean файле конфигурации для bean для выполнения определенных действий при инициализации и уничтожении.

Вот пример, чтобы показать вам, как использовать метод init-method и destroy-method.

package com.xyz.customer.services;

public class CustomerService
{
    String message;

    public String getMessage() {
      return message;
    }

    public void setMessage(String message) {
      this.message = message;
    }

    public void initIt() throws Exception {
      System.out.println("Init method after properties are set : " + message);
    }

    public void cleanUp() throws Exception {
      System.out.println("Spring Container is destroy! Customer clean up");
    }

}

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

<bean id="customerService" class="com.xyz.customer.services.CustomerService" 
    init-method="initIt" destroy-method="cleanUp">

    <property name="message" value="i'm property message" />
</bean>

Ответ 4

И еще один основной отличительный признак - InitializingBean, связанные с DisposableBean методы afterPropertiesSet() и destory() не принимали никаких параметров и возвращаемого типа также void, поэтому мы не реализовали какую-либо пользовательскую логику. Но прибегая к методам BeanPostProcess postProcessBeforeInitialization (Object bean, String beanName) и postProcessAfterInitilization (Object bean, String beanName), принимают эти два параметра и возвращают тип также Object, чтобы мы могли писать логики инициализации, а также любой пользовательский логин основанный на прохождении bean...

Эти оба метода обратного вызова включают в себя жизненный цикл bean, а следующий жизненный цикл следующим образом

1) BeanPostProcessor.postProcessBeforeInitilazation()

2) @postConstruct или InitializingBean.afterPropertiesSet() или метод инициализации, который является  определяя в xml/* здесь также он следует за тем же oredr, если доступны три способа **/

3) BeanPostProcessor.postProcessAfterInitialization()

4) @preDestroy или DisposibleBean.destroy() или уничтожить метод, который определяется в xml    /* здесь также он следует за тем же oredr, если доступно три способа **/

Ответ 5

Инициировать и уничтожать методы обратного вызова являются частью фаз жизненного цикла Spring bean. Инициализация будет выполняться до инициализации bean. Аналогично метод Destroy будет выполняться до bean уничтожения.

Мы можем реализовать эту функциональность с помощью реализации интерфейсов InitializingBean и DisposableBean или с помощью аннотаций @postconstruct и @predestroy или объявить атрибуты <bean> с init-method и destroy-method.

Интерфейс BeanPostProcessor используется для расширения функциональности фреймворка, если вы хотите сделать какую-либо конфигурацию до и после bean создания, выполненного контейнером Spring.

Пример. По умолчанию Spring не будет знать аннотации @postconstruct и @predestroy. Чтобы включить его, нам нужно либо зарегистрировать CommonAnnotationBeanPostProcessor, либо указать конфигурационный файл <context:annotation-config /> в bean. Здесь CommonAnnotationBeanPostProcessor предопределена BeanPostProcessor реализация для аннотаций. Например:

@Required включает инструмент обработки RequiredAnnotationBeanPostProcessor
@Autowired включает инструмент обработки AutowiredAnnotationBeanPostProcessor

Ответ 6

Компонент проходит через несколько этапов от создания до уничтожения в контейнере Spring IoC. Возможно, потребуется выполнить некоторую инициализацию этого компонента до создания этого компонента. Аналогично, перед уничтожением и удалением компонента из контейнера IoC могут потребоваться некоторые операции. Для этой инфраструктуры Spring можно определить методы управления жизненным циклом компонентов.

  • BeanPostProcessor, а метод, указанный в init-method, имеет отношение к этапам создания компонента.

Если компонент реализует интерфейс BeanPostProcessor, то Spring контейнер IoC вызывает методы этого интерфейса: postProcessBeforeInitialization(), postProcessAfterInitialization(). После этого компонент готов к использованию и останется в контейнере IoC до его уничтожения. Метод, указанный в атрибуте init-method, будет вызываться между этими двумя методами. (фактически, до метода afterPropertiesSet() интерфейса InitializingBean, если компонент реализует этот интерфейс).

  • DisposableBean, а метод, указанный в destroy-method, имеет отношение к этапам разрушения компонента.

Если компонент реализует интерфейс DisposableBean, то Spring IoC контейнер вызывает метод этого интерфейса: destroy(). После этого будет вызываться метод, указанный в атрибуте destroy-method. После этого компонент уничтожается.

Предпочтительно использовать методы, перечисленные в атрибутах. Реализация интерфейсов BeanPostProcessor и DisposableBean делает связь между компонентами и API Spring.

Ответ 7

a) Функция postProcessBeforeInitialization() вызывается перед инициализацией bean.

b) После инициализации bean различные методы обратных вызовов вызываются в следующем порядке в соответствии с Spring docs:

  • Методы, аннотированные с помощью @PostConstruct
  • afterPropertiesSet(), как определено интерфейсом обратного вызова InitializingBean
  • метод init, определенный через XML.

Основное отличие состоит в том, что вышеупомянутые 3 метода вызываются после завершения инициализации методом postProcessBeforeInitialization().

Как только эти методы будут завершены, вызывается метод postProcessAfterInitialization(), а затем методы уничтожения вызывают в том же порядке:

  • Методы, аннотированные с помощью @PreDestroy

  • destroy(), как определено интерфейсом обратного вызова DisposableBean

  • метод destroy(), определенный через XML.