1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.apache.struts2.spring;
22
23 import org.springframework.beans.BeanWrapper;
24 import org.springframework.beans.factory.support.RootBeanDefinition;
25 import org.springframework.beans.factory.support.DefaultListableBeanFactory;
26 import org.springframework.beans.factory.CannotLoadBeanClassException;
27 import org.springframework.util.ObjectUtils;
28 import org.springframework.util.ClassUtils;
29 import org.springframework.core.DecoratingClassLoader;
30
31 import java.lang.reflect.Constructor;
32
33
34 /***
35 * Same as DefaultListableBeanFactory, but it doesn't use the constructor and class cached in RootBeanDefinition
36 */
37 public class ClassReloadingBeanFactory extends DefaultListableBeanFactory {
38 @Override
39 protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) {
40 Class beanClass = resolveBeanClass(mbd, beanName);
41
42 if (mbd.getFactoryMethodName() != null) {
43 return instantiateUsingFactoryMethod(beanName, mbd, args);
44 }
45
46
47
48
49
50
51
52
53
54
55
56
57 Constructor[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
58 if (ctors != null ||
59 mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR ||
60 mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
61 return autowireConstructor(beanName, mbd, ctors, args);
62 }
63
64
65 return instantiateBean(beanName, mbd);
66 }
67
68 protected Class resolveBeanClass(RootBeanDefinition mbd, String beanName, Class[] typesToMatch) {
69 try {
70
71
72
73
74 if (typesToMatch != null) {
75 ClassLoader tempClassLoader = getTempClassLoader();
76 if (tempClassLoader != null) {
77 if (tempClassLoader instanceof DecoratingClassLoader) {
78 DecoratingClassLoader dcl = (DecoratingClassLoader) tempClassLoader;
79 for (int i = 0; i < typesToMatch.length; i++) {
80 dcl.excludeClass(typesToMatch[i].getName());
81 }
82 }
83 String className = mbd.getBeanClassName();
84 return (className != null ? ClassUtils.forName(className, tempClassLoader) : null);
85 }
86 }
87 return mbd.resolveBeanClass(getBeanClassLoader());
88 }
89 catch (ClassNotFoundException ex) {
90 throw new CannotLoadBeanClassException(mbd.getResourceDescription(), beanName, mbd.getBeanClassName(), ex);
91 }
92 catch (LinkageError err) {
93 throw new CannotLoadBeanClassException(mbd.getResourceDescription(), beanName, mbd.getBeanClassName(), err);
94 }
95 }
96 }