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.ConfigurableListableBeanFactory;
43 import org.springframework.beans.factory.config.DestructionAwareBeanPostProcessor;
44 import org.springframework.beans.factory.support.AbstractBeanFactory;
45 import org.springframework.beans.factory.support.BeanDefinitionBuilder;
46 import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
47 import org.springframework.beans.factory.support.BeanDefinitionRegistry;
48
49
50
51
52
53
54 public class BeanFactoryUtils {
55
56 private static final Log logger = LogFactory.getLog(BeanFactoryUtils.class);
57
58
59
60
61 public static void destroyBean(Object bean, String beanName, AbstractBeanFactory beanFactory) {
62 applyBeanPostProcessorsBeforeDestruction(bean, beanName, beanFactory);
63 disposeBean(bean, beanName);
64 }
65
66
67
68
69 public static void disposeBean(Object bean, String beanName) {
70 if (bean instanceof DisposableBean) {
71 try {
72 ((DisposableBean) bean).destroy();
73 } catch (Throwable ex) {
74 String msg = "Invocation of destroy method failed on bean with name '" + beanName + "'";
75 if (logger.isDebugEnabled()) {
76 logger.warn(msg, ex);
77 } else {
78 logger.warn(msg + ": " + ex);
79 }
80 }
81 }
82 }
83
84
85
86
87 public static void applyBeanPostProcessorsBeforeDestruction(Object bean, String beanName, AbstractBeanFactory beanFactory) {
88 List<BeanPostProcessor> beanPostProcessors = beanFactory.getBeanPostProcessors();
89 if (beanPostProcessors != null && !beanPostProcessors.isEmpty()) {
90 for (int i = beanPostProcessors.size() - 1; i >= 0; i--) {
91 Object postProcessor = beanPostProcessors.get(i);
92 if (postProcessor instanceof DestructionAwareBeanPostProcessor) {
93 ((DestructionAwareBeanPostProcessor) postProcessor).postProcessBeforeDestruction(bean, beanName);
94 }
95 }
96 }
97 }
98
99
100
101
102
103 public static void registerBeanIfMissing(ConfigurableListableBeanFactory beanFactory, BeanDefinitionRegistry registry, Class<?> beanClass) {
104 if (beanFactory.getBeanNamesForType(beanClass).length == 0) {
105 BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(beanClass);
106 BeanDefinitionReaderUtils.registerWithGeneratedName(builder.getBeanDefinition(), registry);
107 }
108 }
109 }