1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.module.blossom.support;
35
36 import java.util.List;
37
38 import org.apache.commons.logging.Log;
39 import org.apache.commons.logging.LogFactory;
40 import org.springframework.beans.factory.DisposableBean;
41 import org.springframework.beans.factory.config.BeanPostProcessor;
42 import org.springframework.beans.factory.config.DestructionAwareBeanPostProcessor;
43 import org.springframework.beans.factory.support.AbstractBeanFactory;
44
45
46
47
48
49
50 public class BeanFactoryUtils {
51
52 private static final Log logger = LogFactory.getLog(BeanFactoryUtils.class);
53
54
55
56
57 public static void destroyBean(Object bean, String beanName, AbstractBeanFactory beanFactory) {
58 applyBeanPostProcessorsBeforeDestruction(bean, beanName, beanFactory);
59 disposeBean(bean, beanName);
60 }
61
62
63
64
65 public static void disposeBean(Object bean, String beanName) {
66 if (bean instanceof DisposableBean) {
67 try {
68 ((DisposableBean) bean).destroy();
69 } catch (Throwable ex) {
70 String msg = "Invocation of destroy method failed on bean with name '" + beanName + "'";
71 if (logger.isDebugEnabled()) {
72 logger.warn(msg, ex);
73 } else {
74 logger.warn(msg + ": " + ex);
75 }
76 }
77 }
78 }
79
80
81
82
83 public static void applyBeanPostProcessorsBeforeDestruction(Object bean, String beanName, AbstractBeanFactory beanFactory) {
84 List<BeanPostProcessor> beanPostProcessors = beanFactory.getBeanPostProcessors();
85 if (beanPostProcessors != null && !beanPostProcessors.isEmpty()) {
86 for (int i = beanPostProcessors.size() - 1; i >= 0; i--) {
87 Object postProcessor = beanPostProcessors.get(i);
88 if (postProcessor instanceof DestructionAwareBeanPostProcessor)
89 ((DestructionAwareBeanPostProcessor) postProcessor).postProcessBeforeDestruction(bean, beanName);
90 }
91 }
92 }
93 }