@@ -104,19 +104,6 @@ private void postProcessWithRegistry(ConfigurableListableBeanFactory beanFactory
104
104
}
105
105
}
106
106
107
- /**
108
- * Copy certain details of a {@link BeanDefinition} to the definition created by
109
- * this processor for a given {@link OverrideMetadata}.
110
- * <p>The default implementation copies the {@linkplain BeanDefinition#isPrimary()
111
- * primary flag}, @{@linkplain BeanDefinition#isFallback() fallback flag}
112
- * and the {@linkplain BeanDefinition#getScope() scope}.
113
- */
114
- protected void copyBeanDefinitionDetails (BeanDefinition from , RootBeanDefinition to ) {
115
- to .setPrimary (from .isPrimary ());
116
- to .setFallback (from .isFallback ());
117
- to .setScope (from .getScope ());
118
- }
119
-
120
107
private void registerBeanOverride (ConfigurableListableBeanFactory beanFactory , BeanDefinitionRegistry registry ,
121
108
OverrideMetadata overrideMetadata ) {
122
109
@@ -132,6 +119,8 @@ private void registerBeanOverride(ConfigurableListableBeanFactory beanFactory, B
132
119
private void registerReplaceDefinition (ConfigurableListableBeanFactory beanFactory , BeanDefinitionRegistry registry ,
133
120
OverrideMetadata overrideMetadata , boolean enforceExistingDefinition ) {
134
121
122
+ // The following is a "dummy" bean definition which should not be used to
123
+ // create an actual bean instance.
135
124
RootBeanDefinition beanDefinition = createBeanDefinition (overrideMetadata );
136
125
String beanName = overrideMetadata .getBeanName ();
137
126
String beanNameIncludingFactory ;
@@ -157,22 +146,27 @@ else if (enforceExistingDefinition) {
157
146
beanNameIncludingFactory = beanName ;
158
147
}
159
148
149
+ // Process existing bean definition.
160
150
if (existingBeanDefinition != null ) {
161
- copyBeanDefinitionDetails (existingBeanDefinition , beanDefinition );
151
+ copyBeanDefinitionProperties (existingBeanDefinition , beanDefinition );
162
152
registry .removeBeanDefinition (beanName );
163
153
}
154
+
155
+ // At this point, we either removed an existing bean definition above, or
156
+ // there was no bean definition to begin with. So, we register the dummy bean
157
+ // definition to ensure that a bean definition exists for the given bean name.
164
158
registry .registerBeanDefinition (beanName , beanDefinition );
165
159
166
160
Object override = overrideMetadata .createOverride (beanName , existingBeanDefinition , null );
161
+ overrideMetadata .track (override , beanFactory );
162
+ this .overrideRegistrar .registerNameForMetadata (overrideMetadata , beanNameIncludingFactory );
163
+
167
164
if (beanFactory .isSingleton (beanNameIncludingFactory )) {
168
- // Now we have an instance (the override) that we can register.
169
- // At this stage we don't expect a singleton instance to be present,
170
- // and this call will throw if there is such an instance already.
165
+ // Now we have an instance (the override) that we can register. At this
166
+ // stage we don't expect a singleton instance to be present, and this call
167
+ // will throw an exception if there is such an instance already.
171
168
beanFactory .registerSingleton (beanName , override );
172
169
}
173
-
174
- overrideMetadata .track (override , beanFactory );
175
- this .overrideRegistrar .registerNameForMetadata (overrideMetadata , beanNameIncludingFactory );
176
170
}
177
171
178
172
private String getBeanNameForType (ConfigurableListableBeanFactory beanFactory , BeanDefinitionRegistry registry ,
@@ -231,13 +225,6 @@ private void registerWrapBean(ConfigurableListableBeanFactory beanFactory, Overr
231
225
this .overrideRegistrar .registerNameForMetadata (metadata , beanName );
232
226
}
233
227
234
- RootBeanDefinition createBeanDefinition (OverrideMetadata metadata ) {
235
- RootBeanDefinition definition = new RootBeanDefinition (metadata .getBeanType ().resolve ());
236
- definition .setTargetType (metadata .getBeanType ());
237
- definition .setQualifiedElement (metadata .getField ());
238
- return definition ;
239
- }
240
-
241
228
private Set <String > getExistingBeanNamesByType (ConfigurableListableBeanFactory beanFactory , OverrideMetadata metadata ,
242
229
boolean checkAutowiredCandidate ) {
243
230
@@ -272,6 +259,26 @@ private Set<String> getExistingBeanNamesByType(ConfigurableListableBeanFactory b
272
259
}
273
260
274
261
262
+ private static RootBeanDefinition createBeanDefinition (OverrideMetadata metadata ) {
263
+ RootBeanDefinition definition = new RootBeanDefinition (metadata .getBeanType ().resolve ());
264
+ definition .setTargetType (metadata .getBeanType ());
265
+ definition .setQualifiedElement (metadata .getField ());
266
+ return definition ;
267
+ }
268
+
269
+ /**
270
+ * Copy the following properties of the source {@link BeanDefinition} to the
271
+ * target: the {@linkplain BeanDefinition#isPrimary() primary flag}, the
272
+ * {@linkplain BeanDefinition#isFallback() fallback flag}, and the
273
+ * {@linkplain BeanDefinition#getScope() scope}.
274
+ */
275
+ private static void copyBeanDefinitionProperties (BeanDefinition source , RootBeanDefinition target ) {
276
+ target .setPrimary (source .isPrimary ());
277
+ target .setFallback (source .isFallback ());
278
+ target .setScope (source .getScope ());
279
+ }
280
+
281
+
275
282
static class WrapEarlyBeanPostProcessor implements SmartInstantiationAwareBeanPostProcessor ,
276
283
PriorityOrdered {
277
284
0 commit comments