public class InitDestroyAnnotationBeanPostProcessor extends java.lang.Object implements DestructionAwareBeanPostProcessor, MergedBeanDefinitionPostProcessor, PriorityOrdered, java.io.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.
setInitAnnotationType(java.lang.Class<? extends java.lang.annotation.Annotation>)
,
setDestroyAnnotationType(java.lang.Class<? extends java.lang.annotation.Annotation>)
,
Serialized FormModifier and Type | Class and Description |
---|---|
private static class |
InitDestroyAnnotationBeanPostProcessor.LifecycleElement
Class representing injection information about an annotated method.
|
private class |
InitDestroyAnnotationBeanPostProcessor.LifecycleMetadata
Class representing information about annotated init and destroy methods.
|
Modifier and Type | Field and Description |
---|---|
private java.lang.Class<? extends java.lang.annotation.Annotation> |
destroyAnnotationType |
private java.lang.Class<? extends java.lang.annotation.Annotation> |
initAnnotationType |
private java.util.Map<java.lang.Class<?>,InitDestroyAnnotationBeanPostProcessor.LifecycleMetadata> |
lifecycleMetadataCache |
protected Log |
logger |
private int |
order |
HIGHEST_PRECEDENCE, LOWEST_PRECEDENCE
Constructor and Description |
---|
InitDestroyAnnotationBeanPostProcessor() |
Modifier and Type | Method and Description |
---|---|
private InitDestroyAnnotationBeanPostProcessor.LifecycleMetadata |
buildLifecycleMetadata(java.lang.Class<?> clazz) |
private InitDestroyAnnotationBeanPostProcessor.LifecycleMetadata |
findLifecycleMetadata(java.lang.Class<?> clazz) |
int |
getOrder()
Get the order value of this object.
|
java.lang.Object |
postProcessAfterInitialization(java.lang.Object bean,
java.lang.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(java.lang.Object bean,
java.lang.String beanName)
Apply this BeanPostProcessor to the given bean instance before
its destruction.
|
java.lang.Object |
postProcessBeforeInitialization(java.lang.Object bean,
java.lang.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,
java.lang.Class<?> beanType,
java.lang.String beanName)
Post-process the given merged bean definition for the specified bean.
|
private void |
readObject(java.io.ObjectInputStream ois) |
boolean |
requiresDestruction(java.lang.Object bean)
Determine whether the given bean instance requires destruction by this
post-processor.
|
void |
setDestroyAnnotationType(java.lang.Class<? extends java.lang.annotation.Annotation> destroyAnnotationType)
Specify the destroy annotation to check for, indicating destruction
methods to call when the context is shutting down.
|
void |
setInitAnnotationType(java.lang.Class<? extends java.lang.annotation.Annotation> initAnnotationType)
Specify the init annotation to check for, indicating initialization
methods to call after configuration of a bean.
|
void |
setOrder(int order) |
protected transient Log logger
private java.lang.Class<? extends java.lang.annotation.Annotation> initAnnotationType
private java.lang.Class<? extends java.lang.annotation.Annotation> destroyAnnotationType
private int order
private final transient java.util.Map<java.lang.Class<?>,InitDestroyAnnotationBeanPostProcessor.LifecycleMetadata> lifecycleMetadataCache
public InitDestroyAnnotationBeanPostProcessor()
public void setInitAnnotationType(java.lang.Class<? extends java.lang.annotation.Annotation> initAnnotationType)
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.
public void setDestroyAnnotationType(java.lang.Class<? extends java.lang.annotation.Annotation> destroyAnnotationType)
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.
public void setOrder(int order)
public int getOrder()
Ordered
Higher values are interpreted as lower priority. As a consequence,
the object with the lowest value has the highest priority (somewhat
analogous to Servlet load-on-startup
values).
Same order values will result in arbitrary sort positions for the affected objects.
getOrder
in interface Ordered
Ordered.HIGHEST_PRECEDENCE
,
Ordered.LOWEST_PRECEDENCE
public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, java.lang.Class<?> beanType, java.lang.String beanName)
MergedBeanDefinitionPostProcessor
postProcessMergedBeanDefinition
in interface MergedBeanDefinitionPostProcessor
beanDefinition
- the merged bean definition for the beanbeanType
- the actual type of the managed bean instancebeanName
- the name of the beanpublic java.lang.Object postProcessBeforeInitialization(java.lang.Object bean, java.lang.String beanName) throws BeansException
BeanPostProcessor
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.
postProcessBeforeInitialization
in interface BeanPostProcessor
bean
- the new bean instancebeanName
- the name of the beannull
, no subsequent BeanPostProcessors will be invokedBeansException
- in case of errorsInitializingBean.afterPropertiesSet()
public java.lang.Object postProcessAfterInitialization(java.lang.Object bean, java.lang.String beanName) throws BeansException
BeanPostProcessor
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.
postProcessAfterInitialization
in interface BeanPostProcessor
bean
- the new bean instancebeanName
- the name of the beannull
, no subsequent BeanPostProcessors will be invokedBeansException
- in case of errorsInitializingBean.afterPropertiesSet()
,
FactoryBean
public void postProcessBeforeDestruction(java.lang.Object bean, java.lang.String beanName) throws BeansException
DestructionAwareBeanPostProcessor
Like DisposableBean's destroy
and a custom destroy method,
this callback just applies to singleton beans in the factory (including
inner beans).
postProcessBeforeDestruction
in interface DestructionAwareBeanPostProcessor
bean
- the bean instance to be destroyedbeanName
- the name of the beanBeansException
- in case of errorsDisposableBean
,
AbstractBeanDefinition.setDestroyMethodName(java.lang.String)
public boolean requiresDestruction(java.lang.Object bean)
DestructionAwareBeanPostProcessor
NOTE: Even as a late addition, this method has been introduced on
DestructionAwareBeanPostProcessor
itself instead of on a SmartDABPP
subinterface. This allows existing DestructionAwareBeanPostProcessor
implementations to easily provide requiresDestruction
logic while
retaining compatibility with Spring <4.3, and it is also an easier onramp to
declaring requiresDestruction
as a Java 8 default method in Spring 5.
If an implementation of DestructionAwareBeanPostProcessor
does
not provide a concrete implementation of this method, Spring's invocation
mechanism silently assumes a method returning true
(the effective
default before 4.3, and the to-be-default in the Java 8 method in Spring 5).
requiresDestruction
in interface DestructionAwareBeanPostProcessor
bean
- the bean instance to checktrue
if DestructionAwareBeanPostProcessor.postProcessBeforeDestruction(java.lang.Object, java.lang.String)
is supposed to
be called for this bean instance eventually, or false
if not neededprivate InitDestroyAnnotationBeanPostProcessor.LifecycleMetadata findLifecycleMetadata(java.lang.Class<?> clazz)
private InitDestroyAnnotationBeanPostProcessor.LifecycleMetadata buildLifecycleMetadata(java.lang.Class<?> clazz)
private void readObject(java.io.ObjectInputStream ois) throws java.io.IOException, java.lang.ClassNotFoundException
java.io.IOException
java.lang.ClassNotFoundException