|
|
|
|
@ -139,7 +139,7 @@ class DisposableBeanAdapter implements DisposableBean, Runnable, Serializable {
@@ -139,7 +139,7 @@ class DisposableBeanAdapter implements DisposableBean, Runnable, Serializable {
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
this.beanPostProcessors = filterPostProcessors(postProcessors); |
|
|
|
|
this.beanPostProcessors = filterPostProcessors(postProcessors, bean); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
@ -155,7 +155,7 @@ class DisposableBeanAdapter implements DisposableBean, Runnable, Serializable {
@@ -155,7 +155,7 @@ class DisposableBeanAdapter implements DisposableBean, Runnable, Serializable {
|
|
|
|
|
this.invokeDisposableBean = (this.bean instanceof DisposableBean); |
|
|
|
|
this.nonPublicAccessAllowed = true; |
|
|
|
|
this.acc = acc; |
|
|
|
|
this.beanPostProcessors = filterPostProcessors(postProcessors); |
|
|
|
|
this.beanPostProcessors = filterPostProcessors(postProcessors, bean); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
@ -214,16 +214,26 @@ class DisposableBeanAdapter implements DisposableBean, Runnable, Serializable {
@@ -214,16 +214,26 @@ class DisposableBeanAdapter implements DisposableBean, Runnable, Serializable {
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Search for all DestructionAwareBeanPostProcessors in the List. |
|
|
|
|
* @param postProcessors the List to search |
|
|
|
|
* @param processors the List to search |
|
|
|
|
* @return the filtered List of DestructionAwareBeanPostProcessors |
|
|
|
|
*/ |
|
|
|
|
private List<DestructionAwareBeanPostProcessor> filterPostProcessors(List<BeanPostProcessor> postProcessors) { |
|
|
|
|
private List<DestructionAwareBeanPostProcessor> filterPostProcessors(List<BeanPostProcessor> processors, Object bean) { |
|
|
|
|
List<DestructionAwareBeanPostProcessor> filteredPostProcessors = null; |
|
|
|
|
if (!CollectionUtils.isEmpty(postProcessors)) { |
|
|
|
|
filteredPostProcessors = new ArrayList<DestructionAwareBeanPostProcessor>(postProcessors.size()); |
|
|
|
|
for (BeanPostProcessor postProcessor : postProcessors) { |
|
|
|
|
if (postProcessor instanceof DestructionAwareBeanPostProcessor) { |
|
|
|
|
filteredPostProcessors.add((DestructionAwareBeanPostProcessor) postProcessor); |
|
|
|
|
if (!CollectionUtils.isEmpty(processors)) { |
|
|
|
|
filteredPostProcessors = new ArrayList<DestructionAwareBeanPostProcessor>(processors.size()); |
|
|
|
|
for (BeanPostProcessor processor : processors) { |
|
|
|
|
if (processor instanceof DestructionAwareBeanPostProcessor) { |
|
|
|
|
DestructionAwareBeanPostProcessor dabpp = (DestructionAwareBeanPostProcessor) processor; |
|
|
|
|
try { |
|
|
|
|
if (dabpp.requiresDestruction(bean)) { |
|
|
|
|
filteredPostProcessors.add(dabpp); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
catch (AbstractMethodError err) { |
|
|
|
|
// A pre-4.3 third-party DestructionAwareBeanPostProcessor...
|
|
|
|
|
// As of 5.0, we can let requiresDestruction be a Java 8 default method which returns true.
|
|
|
|
|
filteredPostProcessors.add(dabpp); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
@ -401,9 +411,36 @@ class DisposableBeanAdapter implements DisposableBean, Runnable, Serializable {
@@ -401,9 +411,36 @@ class DisposableBeanAdapter implements DisposableBean, Runnable, Serializable {
|
|
|
|
|
} |
|
|
|
|
String destroyMethodName = beanDefinition.getDestroyMethodName(); |
|
|
|
|
if (AbstractBeanDefinition.INFER_METHOD.equals(destroyMethodName)) { |
|
|
|
|
return ClassUtils.hasMethod(bean.getClass(), CLOSE_METHOD_NAME); |
|
|
|
|
return (ClassUtils.hasMethod(bean.getClass(), CLOSE_METHOD_NAME) || |
|
|
|
|
ClassUtils.hasMethod(bean.getClass(), SHUTDOWN_METHOD_NAME)); |
|
|
|
|
} |
|
|
|
|
return StringUtils.hasLength(destroyMethodName); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Check whether the given bean has destruction-aware post-processors applying to it. |
|
|
|
|
* @param bean the bean instance |
|
|
|
|
* @param postProcessors the post-processor candidates |
|
|
|
|
*/ |
|
|
|
|
public static boolean hasApplicableProcessors(Object bean, List<BeanPostProcessor> postProcessors) { |
|
|
|
|
if (!CollectionUtils.isEmpty(postProcessors)) { |
|
|
|
|
for (BeanPostProcessor processor : postProcessors) { |
|
|
|
|
if (processor instanceof DestructionAwareBeanPostProcessor) { |
|
|
|
|
DestructionAwareBeanPostProcessor dabpp = (DestructionAwareBeanPostProcessor) processor; |
|
|
|
|
try { |
|
|
|
|
if (dabpp.requiresDestruction(bean)) { |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
catch (AbstractMethodError err) { |
|
|
|
|
// A pre-4.3 third-party DestructionAwareBeanPostProcessor...
|
|
|
|
|
// As of 5.0, we can let requiresDestruction be a Java 8 default method which returns true.
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|