В чем разница между реализацией интерфейса BeanPostProcessor и использованием атрибутов метода init/destroy в файле конфигурации XML в Spring или реализации интерфейса InitializingBean/DisposableBean?
В чем разница между BeanPostProcessor и методом init/destroy в Spring?
Ответ 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.