InitDestroyAnnotationBeanPostProcessor (Spring Framework 3.2.1.RELEASE API)
Date: 2013-01-24

org.springframework.beans.factory.annotation

## Class InitDestroyAnnotationBeanPostProcessor

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

- All Implemented Interfaces:
    Serializable, BeanPostProcessor, DestructionAwareBeanPostProcessor, MergedBeanDefinitionPostProcessor, Ordered, PriorityOrdered
  Direct Known Subclasses:
    CommonAnnotationBeanPostProcessor

      public class InitDestroyAnnotationBeanPostProcessor
      extends Object
      implements DestructionAwareBeanPostProcessor, MergedBeanDefinitionPostProcessor, 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 `CommonAnnotationBeanPostProcessor` supports the JSR-250 `PostConstruct` and `PreDestroy` annotations out of the box, as init annotation and destroy annotation, respectively. Furthermore, it also supports the `Resource` annotation for annotation-driven injection of named beans.

  Since:
    2.5
  Author:
    Juergen Hoeller
  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 and Description
    --- | ---
    `protected Log` | `logger`

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

      `HIGHEST_PRECEDENCE, LOWEST_PRECEDENCE`

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `InitDestroyAnnotationBeanPostProcessor()`

  - ### Method Summary

    Methods
    Modifier and Type | Method and Description
    --- | ---
    `int` | `getOrder()` Return the order value of this object, with a higher value meaning greater in terms of sorting.
    `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.
    `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<?> beanType, String beanName)` Post-process the given merged bean definition for the specified bean.
    `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`

- - ### Field Detail

    - #### logger

          protected transient Log logger

  - ### Constructor Detail

    - #### InitDestroyAnnotationBeanPostProcessor

          public InitDestroyAnnotationBeanPostProcessor()

  - ### Method Detail

    - #### 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 JSR-250 `PostConstruct` 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 JSR-250 `PreDestroy` annotation.

    - #### setOrder

          public void setOrder(int order)

    - #### getOrder

          public int getOrder()

      Description copied from interface: `Ordered`
      Return the order value of this object, with a higher value meaning greater in terms of sorting.

      Normally starting with 0, with `Integer.MAX_VALUE` indicating the greatest value. Same order values will result in arbitrary positions for the affected objects.

      Higher values can be interpreted as lower priority. As a consequence, the object with the lowest value has highest priority (somewhat analogous to Servlet "load-on-startup" values).

      Specified by:
        `getOrder` in interface `Ordered`
      Returns:
        the order value

    - #### postProcessMergedBeanDefinition

          public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition,
                                             Class<?> beanType,
                                             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
        `beanType` - the actual type of the managed bean instance
        `beanName` - the name of the bean

    - #### 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.
      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.

      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. Can invoke custom destruction callbacks.

      Like DisposableBean's `destroy` and a custom destroy method, this callback just applies to singleton beans in the factory (including inner 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`, `AbstractBeanDefinition.setDestroyMethodName(java.lang.String)`