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
See Also:
  • Field Details

    • logger

      protected transient 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.

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

    • 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<?> 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
      See Also:
    • processAheadOfTime

      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:
    • 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:
    • 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, e.g. 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:
    • 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