Package org.springframework.beans.factory.annotation

# Class InitDestroyAnnotationBeanPostProcessor

java.lang.Object
org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor

All Implemented Interfaces:
  `Serializable`, `BeanRegistrationAotProcessor`, `BeanPostProcessor`, `DestructionAwareBeanPostProcessor`, `MergedBeanDefinitionPostProcessor`, `org.springframework.core.Ordered`, `org.springframework.core.PriorityOrdered`

public class InitDestroyAnnotationBeanPostProcessor extends Object implements DestructionAwareBeanPostProcessor, MergedBeanDefinitionPostProcessor, BeanRegistrationAotProcessor, org.springframework.core.PriorityOrdered, Serializable
`BeanPostProcessor` implementation that invokes annotated init and destroy methods. Allows for an annotation alternative to Spring's `InitializingBean` and `DisposableBean` callback interfaces.

The actual annotation types that this post-processor checks for can be configured through the `"initAnnotationType"` and `"destroyAnnotationType"` properties. Any custom annotation can be used, since there are no required annotation attributes.

Init and destroy annotations may be applied to methods of any visibility: public, package-protected, protected, or private. Multiple such methods may be annotated, but it is recommended to only annotate one single init method and destroy method, respectively.

Spring's `org.springframework.context.annotation.CommonAnnotationBeanPostProcessor` supports the `jakarta.annotation.PostConstruct` and `jakarta.annotation.PreDestroy` annotations out of the box, as init annotation and destroy annotation, respectively. Furthermore, it also supports the `jakarta.annotation.Resource` annotation for annotation-driven injection of named beans.

Since:
  2.5
Author:
  Juergen Hoeller, Stephane Nicoll, Phillip Webb, Sam Brannen
See Also:
  - `setInitAnnotationType(java.lang.Class<? extends java.lang.annotation.Annotation>)`
  - `setDestroyAnnotationType(java.lang.Class<? extends java.lang.annotation.Annotation>)`
  - Serialized Form

## Field Summary

Fields
Modifier and Type
Field
Description
`protected org.apache.commons.logging.Log`
`logger`

### Fields inherited from interface org.springframework.beans.factory.aot.BeanRegistrationAotProcessor

`IGNORE_REGISTRATION_ATTRIBUTE`

### Fields inherited from interface org.springframework.core.Ordered

`HIGHEST_PRECEDENCE, LOWEST_PRECEDENCE`

## Constructor Summary

Constructors
Constructor
Description
`InitDestroyAnnotationBeanPostProcessor()`

## Method Summary

Modifier and Type
Method
Description
`void`
`addDestroyAnnotationType(Class<? extends Annotation> destroyAnnotationType)`
Add a destroy annotation to check for, indicating destruction methods to call when the context is shutting down.
`void`
`addInitAnnotationType(Class<? extends Annotation> initAnnotationType)`
Add an init annotation to check for, indicating initialization methods to call after configuration of a bean.
`int`
`getOrder()`
`Object`
`postProcessAfterInitialization(Object bean, String beanName)`
Apply this `BeanPostProcessor` to the given new bean instance after any bean initialization callbacks (like InitializingBean's `afterPropertiesSet` or a custom init-method).
`void`
`postProcessBeforeDestruction(Object bean, String beanName)`
Apply this BeanPostProcessor to the given bean instance before its destruction, for example, invoking custom destruction callbacks.
`Object`
`postProcessBeforeInitialization(Object bean, String beanName)`
Apply this `BeanPostProcessor` to the given new bean instance before any bean initialization callbacks (like InitializingBean's `afterPropertiesSet` or a custom init-method).
`void`
`postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanClass, String beanName)`
Post-process the given merged bean definition for the specified bean.
`BeanRegistrationAotContribution`
`processAheadOfTime(RegisteredBean registeredBean)`
Process the given `RegisteredBean` instance ahead-of-time and return a contribution or `null`.
`boolean`
`requiresDestruction(Object bean)`
Determine whether the given bean instance requires destruction by this post-processor.
`void`
`setDestroyAnnotationType(Class<? extends Annotation> destroyAnnotationType)`
Specify the destroy annotation to check for, indicating destruction methods to call when the context is shutting down.
`void`
`setInitAnnotationType(Class<? extends Annotation> initAnnotationType)`
Specify the init annotation to check for, indicating initialization methods to call after configuration of a bean.
`void`
`setOrder(int order)`

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

### Methods inherited from interface org.springframework.beans.factory.aot.BeanRegistrationAotProcessor

`isBeanExcludedFromAotProcessing`

### Methods inherited from interface org.springframework.beans.factory.support.MergedBeanDefinitionPostProcessor

`resetBeanDefinition`

## Field Details

### logger

protected transient org.apache.commons.logging.Log logger

## Constructor Details

### InitDestroyAnnotationBeanPostProcessor

public InitDestroyAnnotationBeanPostProcessor()

## Method Details

### setInitAnnotationType

public void setInitAnnotationType(Class<? extends Annotation> initAnnotationType)
Specify the init annotation to check for, indicating initialization methods to call after configuration of a bean.

Any custom annotation can be used, since there are no required annotation attributes. There is no default, although a typical choice is the `jakarta.annotation.PostConstruct` annotation.

See Also:
  - `addInitAnnotationType(java.lang.Class<? extends java.lang.annotation.Annotation>)`

### addInitAnnotationType

public void addInitAnnotationType(@Nullable Class<? extends Annotation> initAnnotationType)
Add an init annotation to check for, indicating initialization methods to call after configuration of a bean.

Since:
  6.0.11
See Also:
  - `setInitAnnotationType(java.lang.Class<? extends java.lang.annotation.Annotation>)`

### setDestroyAnnotationType

public void setDestroyAnnotationType(Class<? extends Annotation> destroyAnnotationType)
Specify the destroy annotation to check for, indicating destruction methods to call when the context is shutting down.

Any custom annotation can be used, since there are no required annotation attributes. There is no default, although a typical choice is the `jakarta.annotation.PreDestroy` annotation.

See Also:
  - `addDestroyAnnotationType(java.lang.Class<? extends java.lang.annotation.Annotation>)`

### addDestroyAnnotationType

public void addDestroyAnnotationType(@Nullable Class<? extends Annotation> destroyAnnotationType)
Add a destroy annotation to check for, indicating destruction methods to call when the context is shutting down.

Since:
  6.0.11
See Also:
  - `setDestroyAnnotationType(java.lang.Class<? extends java.lang.annotation.Annotation>)`

### setOrder

public void setOrder(int order)

### getOrder

public int getOrder()

Specified by:
  `getOrder` in interface `org.springframework.core.Ordered`

### postProcessMergedBeanDefinition

public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanClass, String beanName)
Description copied from interface: `MergedBeanDefinitionPostProcessor`
Post-process the given merged bean definition for the specified bean.

Specified by:
  `postProcessMergedBeanDefinition` in interface `MergedBeanDefinitionPostProcessor`
Parameters:
  `beanDefinition` - the merged bean definition for the bean
  `beanClass` - the actual type of the managed bean instance
  `beanName` - the name of the bean
See Also:
  - `AbstractAutowireCapableBeanFactory.applyMergedBeanDefinitionPostProcessors(org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Class<?>, java.lang.String)`

### processAheadOfTime

@Nullable public BeanRegistrationAotContribution processAheadOfTime(RegisteredBean registeredBean)
Description copied from interface: `BeanRegistrationAotProcessor`
Process the given `RegisteredBean` instance ahead-of-time and return a contribution or `null`.

Processors are free to use any techniques they like to analyze the given instance. Most typically use reflection to find fields or methods to use in the contribution. Contributions typically generate source code or resource files that can be used when the AOT optimized application runs.

If the given instance isn't relevant to the processor, it should return a `null` contribution.

Specified by:
  `processAheadOfTime` in interface `BeanRegistrationAotProcessor`
Parameters:
  `registeredBean` - the registered bean to process
Returns:
  a `BeanRegistrationAotContribution` or `null`

### postProcessBeforeInitialization

public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException
Description copied from interface: `BeanPostProcessor`
Apply this `BeanPostProcessor` to the given new bean instance before any bean initialization callbacks (like InitializingBean's `afterPropertiesSet` or a custom init-method). The bean will already be populated with property values. The returned bean instance may be a wrapper around the original.

The default implementation returns the given `bean` as-is.

Specified by:
  `postProcessBeforeInitialization` in interface `BeanPostProcessor`
Parameters:
  `bean` - the new bean instance
  `beanName` - the name of the bean
Returns:
  the bean instance to use, either the original or a wrapped one; if `null`, no subsequent BeanPostProcessors will be invoked
Throws:
  `BeansException` - in case of errors
See Also:
  - `InitializingBean.afterPropertiesSet()`

### postProcessAfterInitialization

public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException
Description copied from interface: `BeanPostProcessor`
Apply this `BeanPostProcessor` to the given new bean instance after any bean initialization callbacks (like InitializingBean's `afterPropertiesSet` or a custom init-method). The bean will already be populated with property values. The returned bean instance may be a wrapper around the original.

In case of a FactoryBean, this callback will be invoked for both the FactoryBean instance and the objects created by the FactoryBean (as of Spring 2.0). The post-processor can decide whether to apply to either the FactoryBean or created objects or both through corresponding `bean instanceof FactoryBean` checks.

This callback will also be invoked after a short-circuiting triggered by a `InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation(java.lang.Class<?>, java.lang.String)` method, in contrast to all other `BeanPostProcessor` callbacks.

The default implementation returns the given `bean` as-is.

Specified by:
  `postProcessAfterInitialization` in interface `BeanPostProcessor`
Parameters:
  `bean` - the new bean instance
  `beanName` - the name of the bean
Returns:
  the bean instance to use, either the original or a wrapped one; if `null`, no subsequent BeanPostProcessors will be invoked
Throws:
  `BeansException` - in case of errors
See Also:
  - `InitializingBean.afterPropertiesSet()`
  - `FactoryBean`

### postProcessBeforeDestruction

public void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException
Description copied from interface: `DestructionAwareBeanPostProcessor`
Apply this BeanPostProcessor to the given bean instance before its destruction, for example, invoking custom destruction callbacks.

Like DisposableBean's `destroy` and a custom destroy method, this callback will only apply to beans which the container fully manages the lifecycle for. This is usually the case for singletons and scoped beans.

Specified by:
  `postProcessBeforeDestruction` in interface `DestructionAwareBeanPostProcessor`
Parameters:
  `bean` - the bean instance to be destroyed
  `beanName` - the name of the bean
Throws:
  `BeansException` - in case of errors
See Also:
  - `DisposableBean.destroy()`
  - `AbstractBeanDefinition.setDestroyMethodName(String)`

### requiresDestruction

public boolean requiresDestruction(Object bean)
Description copied from interface: `DestructionAwareBeanPostProcessor`
Determine whether the given bean instance requires destruction by this post-processor.

The default implementation returns `true`. If a pre-5 implementation of `DestructionAwareBeanPostProcessor` does not provide a concrete implementation of this method, Spring silently assumes `true` as well.

Specified by:
  `requiresDestruction` in interface `DestructionAwareBeanPostProcessor`
Parameters:
  `bean` - the bean instance to check
Returns:
  `true` if `DestructionAwareBeanPostProcessor.postProcessBeforeDestruction(java.lang.Object, java.lang.String)` is supposed to be called for this bean instance eventually, or `false` if not needed