1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.beans.factory.support;
18
19 import java.lang.reflect.Member;
20 import java.lang.reflect.Method;
21 import java.util.HashSet;
22 import java.util.Set;
23
24 import org.springframework.beans.MutablePropertyValues;
25 import org.springframework.beans.factory.config.BeanDefinition;
26 import org.springframework.beans.factory.config.BeanDefinitionHolder;
27 import org.springframework.beans.factory.config.ConstructorArgumentValues;
28 import org.springframework.util.Assert;
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 @SuppressWarnings("serial")
49 public class RootBeanDefinition extends AbstractBeanDefinition {
50
51 boolean allowCaching = true;
52
53 private BeanDefinitionHolder decoratedDefinition;
54
55 private volatile Class<?> targetType;
56
57 boolean isFactoryMethodUnique = false;
58
59 final Object constructorArgumentLock = new Object();
60
61
62 Object resolvedConstructorOrFactoryMethod;
63
64
65 volatile Class<?> resolvedFactoryMethodReturnType;
66
67
68 boolean constructorArgumentsResolved = false;
69
70
71 Object[] resolvedConstructorArguments;
72
73
74 Object[] preparedConstructorArguments;
75
76 final Object postProcessingLock = new Object();
77
78
79 boolean postProcessed = false;
80
81
82 volatile Boolean beforeInstantiationResolved;
83
84 private Set<Member> externallyManagedConfigMembers;
85
86 private Set<String> externallyManagedInitMethods;
87
88 private Set<String> externallyManagedDestroyMethods;
89
90
91
92
93
94
95
96
97
98
99
100
101
102 public RootBeanDefinition() {
103 super();
104 }
105
106
107
108
109
110 public RootBeanDefinition(Class<?> beanClass) {
111 super();
112 setBeanClass(beanClass);
113 }
114
115
116
117
118
119
120
121
122
123 public RootBeanDefinition(Class<?> beanClass, int autowireMode, boolean dependencyCheck) {
124 super();
125 setBeanClass(beanClass);
126 setAutowireMode(autowireMode);
127 if (dependencyCheck && getResolvedAutowireMode() != AUTOWIRE_CONSTRUCTOR) {
128 setDependencyCheck(RootBeanDefinition.DEPENDENCY_CHECK_OBJECTS);
129 }
130 }
131
132
133
134
135
136
137
138
139 public RootBeanDefinition(Class<?> beanClass, ConstructorArgumentValues cargs, MutablePropertyValues pvs) {
140 super(cargs, pvs);
141 setBeanClass(beanClass);
142 }
143
144
145
146
147
148
149
150 public RootBeanDefinition(String beanClassName) {
151 setBeanClassName(beanClassName);
152 }
153
154
155
156
157
158
159
160
161
162 public RootBeanDefinition(String beanClassName, ConstructorArgumentValues cargs, MutablePropertyValues pvs) {
163 super(cargs, pvs);
164 setBeanClassName(beanClassName);
165 }
166
167
168
169
170
171
172 public RootBeanDefinition(RootBeanDefinition original) {
173 super(original);
174 this.allowCaching = original.allowCaching;
175 this.decoratedDefinition = original.decoratedDefinition;
176 this.targetType = original.targetType;
177 this.isFactoryMethodUnique = original.isFactoryMethodUnique;
178 }
179
180
181
182
183
184
185 RootBeanDefinition(BeanDefinition original) {
186 super(original);
187 }
188
189
190 @Override
191 public String getParentName() {
192 return null;
193 }
194
195 @Override
196 public void setParentName(String parentName) {
197 if (parentName != null) {
198 throw new IllegalArgumentException("Root bean cannot be changed into a child bean with parent reference");
199 }
200 }
201
202
203
204
205 public void setDecoratedDefinition(BeanDefinitionHolder decoratedDefinition) {
206 this.decoratedDefinition = decoratedDefinition;
207 }
208
209
210
211
212 public BeanDefinitionHolder getDecoratedDefinition() {
213 return this.decoratedDefinition;
214 }
215
216
217
218
219 public void setTargetType(Class<?> targetType) {
220 this.targetType = targetType;
221 }
222
223
224
225
226
227 public Class<?> getTargetType() {
228 return this.targetType;
229 }
230
231
232
233
234 public void setUniqueFactoryMethodName(String name) {
235 Assert.hasText(name, "Factory method name must not be empty");
236 setFactoryMethodName(name);
237 this.isFactoryMethodUnique = true;
238 }
239
240
241
242
243 public boolean isFactoryMethod(Method candidate) {
244 return (candidate != null && candidate.getName().equals(getFactoryMethodName()));
245 }
246
247
248
249
250
251 public Method getResolvedFactoryMethod() {
252 synchronized (this.constructorArgumentLock) {
253 Object candidate = this.resolvedConstructorOrFactoryMethod;
254 return (candidate instanceof Method ? (Method) candidate : null);
255 }
256 }
257
258 public void registerExternallyManagedConfigMember(Member configMember) {
259 synchronized (this.postProcessingLock) {
260 if (this.externallyManagedConfigMembers == null) {
261 this.externallyManagedConfigMembers = new HashSet<Member>(1);
262 }
263 this.externallyManagedConfigMembers.add(configMember);
264 }
265 }
266
267 public boolean isExternallyManagedConfigMember(Member configMember) {
268 synchronized (this.postProcessingLock) {
269 return (this.externallyManagedConfigMembers != null &&
270 this.externallyManagedConfigMembers.contains(configMember));
271 }
272 }
273
274 public void registerExternallyManagedInitMethod(String initMethod) {
275 synchronized (this.postProcessingLock) {
276 if (this.externallyManagedInitMethods == null) {
277 this.externallyManagedInitMethods = new HashSet<String>(1);
278 }
279 this.externallyManagedInitMethods.add(initMethod);
280 }
281 }
282
283 public boolean isExternallyManagedInitMethod(String initMethod) {
284 synchronized (this.postProcessingLock) {
285 return (this.externallyManagedInitMethods != null &&
286 this.externallyManagedInitMethods.contains(initMethod));
287 }
288 }
289
290 public void registerExternallyManagedDestroyMethod(String destroyMethod) {
291 synchronized (this.postProcessingLock) {
292 if (this.externallyManagedDestroyMethods == null) {
293 this.externallyManagedDestroyMethods = new HashSet<String>(1);
294 }
295 this.externallyManagedDestroyMethods.add(destroyMethod);
296 }
297 }
298
299 public boolean isExternallyManagedDestroyMethod(String destroyMethod) {
300 synchronized (this.postProcessingLock) {
301 return (this.externallyManagedDestroyMethods != null &&
302 this.externallyManagedDestroyMethods.contains(destroyMethod));
303 }
304 }
305
306
307 @Override
308 public RootBeanDefinition cloneBeanDefinition() {
309 return new RootBeanDefinition(this);
310 }
311
312 @Override
313 public boolean equals(Object other) {
314 return (this == other || (other instanceof RootBeanDefinition && super.equals(other)));
315 }
316
317 @Override
318 public String toString() {
319 return "Root bean: " + super.toString();
320 }
321
322 }