Skip to content

Commit e64c6df

Browse files
committed
MergedBeanDefinitionPostProcessors clear internal caches on bean reset
Issue: SPR-17126
1 parent 69c6a40 commit e64c6df

File tree

6 files changed

+38
-5
lines changed

6 files changed

+38
-5
lines changed

spring-beans/src/main/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,12 @@ public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, C
233233
metadata.checkConfigMembers(beanDefinition);
234234
}
235235

236+
@Override
237+
public void resetBeanDefinition(String beanName) {
238+
this.lookupMethodsChecked.remove(beanName);
239+
this.injectionMetadataCache.remove(beanName);
240+
}
241+
236242
@Override
237243
@Nullable
238244
public Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, final String beanName)

spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -415,8 +415,8 @@ public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, S
415415
throws BeansException {
416416

417417
Object result = existingBean;
418-
for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
419-
Object current = beanProcessor.postProcessBeforeInitialization(result, beanName);
418+
for (BeanPostProcessor processor : getBeanPostProcessors()) {
419+
Object current = processor.postProcessBeforeInitialization(result, beanName);
420420
if (current == null) {
421421
return result;
422422
}
@@ -430,8 +430,8 @@ public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, St
430430
throws BeansException {
431431

432432
Object result = existingBean;
433-
for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
434-
Object current = beanProcessor.postProcessAfterInitialization(result, beanName);
433+
for (BeanPostProcessor processor : getBeanPostProcessors()) {
434+
Object current = processor.postProcessAfterInitialization(result, beanName);
435435
if (current == null) {
436436
return result;
437437
}

spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
6666
import org.springframework.beans.factory.config.BeanDefinition;
6767
import org.springframework.beans.factory.config.BeanDefinitionHolder;
68+
import org.springframework.beans.factory.config.BeanPostProcessor;
6869
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
6970
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
7071
import org.springframework.beans.factory.config.DependencyDescriptor;
@@ -969,6 +970,13 @@ protected void resetBeanDefinition(String beanName) {
969970
// (e.g. the default StaticMessageSource in a StaticApplicationContext).
970971
destroySingleton(beanName);
971972

973+
// Notify all post-processors that the specified bean definition has been reset.
974+
for (BeanPostProcessor processor : getBeanPostProcessors()) {
975+
if (processor instanceof MergedBeanDefinitionPostProcessor) {
976+
((MergedBeanDefinitionPostProcessor) processor).resetBeanDefinition(beanName);
977+
}
978+
}
979+
972980
// Reset all bean definitions that have the given bean as parent (recursively).
973981
for (String bdName : this.beanDefinitionNames) {
974982
if (!beanName.equals(bdName)) {

spring-beans/src/main/java/org/springframework/beans/factory/support/MergedBeanDefinitionPostProcessor.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2016 the original author or authors.
2+
* Copyright 2002-2018 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -45,4 +45,13 @@ public interface MergedBeanDefinitionPostProcessor extends BeanPostProcessor {
4545
*/
4646
void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName);
4747

48+
/**
49+
* A notification that the bean definition for the specified name has been reset,
50+
* and that this post-processor should clear any metadata for the affected bean.
51+
* @param beanName the name of the bean
52+
* @since 5.1
53+
*/
54+
default void resetBeanDefinition(String beanName) {
55+
}
56+
4857
}

spring-context/src/main/java/org/springframework/context/annotation/CommonAnnotationBeanPostProcessor.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,11 @@ public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, C
299299
metadata.checkConfigMembers(beanDefinition);
300300
}
301301

302+
@Override
303+
public void resetBeanDefinition(String beanName) {
304+
this.injectionMetadataCache.remove(beanName);
305+
}
306+
302307
@Override
303308
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) {
304309
return null;

spring-orm/src/main/java/org/springframework/orm/jpa/support/PersistenceAnnotationBeanPostProcessor.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,11 @@ public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, C
334334
metadata.checkConfigMembers(beanDefinition);
335335
}
336336

337+
@Override
338+
public void resetBeanDefinition(String beanName) {
339+
this.injectionMetadataCache.remove(beanName);
340+
}
341+
337342
@Override
338343
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) {
339344
return null;

0 commit comments

Comments
 (0)