Revert "Make sure inferred destroy method is set on the original bean definition"
This reverts commit 2e1538a20b.
			
			
This commit is contained in:
		
							parent
							
								
									cd2b7afc87
								
							
						
					
					
						commit
						0a9db7cc47
					
				|  | @ -41,9 +41,7 @@ import org.springframework.beans.BeansException; | |||
| import org.springframework.beans.factory.BeanCreationException; | ||||
| import org.springframework.beans.factory.aot.BeanRegistrationAotContribution; | ||||
| import org.springframework.beans.factory.aot.BeanRegistrationAotProcessor; | ||||
| import org.springframework.beans.factory.config.BeanDefinition; | ||||
| import org.springframework.beans.factory.config.DestructionAwareBeanPostProcessor; | ||||
| import org.springframework.beans.factory.support.AbstractBeanDefinition; | ||||
| import org.springframework.beans.factory.support.MergedBeanDefinitionPostProcessor; | ||||
| import org.springframework.beans.factory.support.RegisteredBean; | ||||
| import org.springframework.beans.factory.support.RootBeanDefinition; | ||||
|  | @ -160,30 +158,20 @@ public class InitDestroyAnnotationBeanPostProcessor implements DestructionAwareB | |||
| 
 | ||||
| 	@Override | ||||
| 	public BeanRegistrationAotContribution processAheadOfTime(RegisteredBean registeredBean) { | ||||
| 		AbstractBeanDefinition beanDefinition = getOriginalBeanDefinition(registeredBean); | ||||
| 		if (beanDefinition != null) { | ||||
| 			RootBeanDefinition mergedBeanDefinition = registeredBean.getMergedBeanDefinition(); | ||||
| 			beanDefinition.resolveDestroyMethodIfNecessary(); | ||||
| 			LifecycleMetadata metadata = findInjectionMetadata(mergedBeanDefinition, registeredBean.getBeanClass()); | ||||
| 			if (!CollectionUtils.isEmpty(metadata.initMethods)) { | ||||
| 				String[] initMethodNames = safeMerge(beanDefinition.getInitMethodNames(), metadata.initMethods); | ||||
| 				beanDefinition.setInitMethodNames(initMethodNames); | ||||
| 			} | ||||
| 			if (!CollectionUtils.isEmpty(metadata.destroyMethods)) { | ||||
| 				String[] destroyMethodNames = safeMerge(beanDefinition.getDestroyMethodNames(), metadata.destroyMethods); | ||||
| 				beanDefinition.setDestroyMethodNames(destroyMethodNames); | ||||
| 			} | ||||
| 			registeredBean.getBeanFactory().clearMetadataCache(); | ||||
| 		RootBeanDefinition beanDefinition = registeredBean.getMergedBeanDefinition(); | ||||
| 		beanDefinition.resolveDestroyMethodIfNecessary(); | ||||
| 		LifecycleMetadata metadata = findInjectionMetadata(beanDefinition, registeredBean.getBeanClass()); | ||||
| 		if (!CollectionUtils.isEmpty(metadata.initMethods)) { | ||||
| 			String[] initMethodNames = safeMerge(beanDefinition.getInitMethodNames(), metadata.initMethods); | ||||
| 			beanDefinition.setInitMethodNames(initMethodNames); | ||||
| 		} | ||||
| 		if (!CollectionUtils.isEmpty(metadata.destroyMethods)) { | ||||
| 			String[] destroyMethodNames = safeMerge(beanDefinition.getDestroyMethodNames(), metadata.destroyMethods); | ||||
| 			beanDefinition.setDestroyMethodNames(destroyMethodNames); | ||||
| 		} | ||||
| 		return null; | ||||
| 	} | ||||
| 
 | ||||
| 	@Nullable | ||||
| 	private AbstractBeanDefinition getOriginalBeanDefinition(RegisteredBean registeredBean) { | ||||
| 		BeanDefinition beanDefinition = registeredBean.getBeanFactory().getBeanDefinition(registeredBean.getBeanName()); | ||||
| 		return (beanDefinition instanceof AbstractBeanDefinition abd ? abd : null); | ||||
| 	} | ||||
| 
 | ||||
| 	private LifecycleMetadata findInjectionMetadata(RootBeanDefinition beanDefinition, Class<?> beanType) { | ||||
| 		LifecycleMetadata metadata = findLifecycleMetadata(beanType); | ||||
| 		metadata.checkConfigMembers(beanDefinition); | ||||
|  |  | |||
|  | @ -1186,14 +1186,6 @@ public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccess | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Resolve the inferred destroy method if necessary. | ||||
| 	 * @since 6.0 | ||||
| 	 */ | ||||
| 	public void resolveDestroyMethodIfNecessary() { | ||||
| 		setDestroyMethodNames(DisposableBeanAdapter | ||||
| 				.inferDestroyMethodsIfNecessary(getResolvableType().toClass(), this)); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Public declaration of Object's {@code clone()} method. | ||||
|  |  | |||
|  | @ -344,14 +344,13 @@ class DisposableBeanAdapter implements DisposableBean, Runnable, Serializable { | |||
| 	 * interfaces, reflectively calling the "close" method on implementing beans as well. | ||||
| 	 */ | ||||
| 	@Nullable | ||||
| 	static String[] inferDestroyMethodsIfNecessary(Class<?> target, AbstractBeanDefinition beanDefinition) { | ||||
| 	static String[] inferDestroyMethodsIfNecessary(Class<?> target, RootBeanDefinition beanDefinition) { | ||||
| 		String[] destroyMethodNames = beanDefinition.getDestroyMethodNames(); | ||||
| 		if (destroyMethodNames != null && destroyMethodNames.length > 1) { | ||||
| 			return destroyMethodNames; | ||||
| 		} | ||||
| 
 | ||||
| 		String destroyMethodName = (beanDefinition instanceof RootBeanDefinition rbd | ||||
| 				? rbd.resolvedDestroyMethodName : null); | ||||
| 		String destroyMethodName = beanDefinition.resolvedDestroyMethodName; | ||||
| 		if (destroyMethodName == null) { | ||||
| 			destroyMethodName = beanDefinition.getDestroyMethodName(); | ||||
| 			boolean autoCloseable = (AutoCloseable.class.isAssignableFrom(target)); | ||||
|  | @ -379,9 +378,7 @@ class DisposableBeanAdapter implements DisposableBean, Runnable, Serializable { | |||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 			if (beanDefinition instanceof RootBeanDefinition rbd) { | ||||
| 				rbd.resolvedDestroyMethodName = (destroyMethodName != null ? destroyMethodName : ""); | ||||
| 			} | ||||
| 			beanDefinition.resolvedDestroyMethodName = (destroyMethodName != null ? destroyMethodName : ""); | ||||
| 		} | ||||
| 		return (StringUtils.hasLength(destroyMethodName) ? new String[] {destroyMethodName} : null); | ||||
| 	} | ||||
|  |  | |||
|  | @ -550,6 +550,15 @@ public class RootBeanDefinition extends AbstractBeanDefinition { | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Resolve the inferred destroy method if necessary. | ||||
| 	 * @since 6.0 | ||||
| 	 */ | ||||
| 	public void resolveDestroyMethodIfNecessary() { | ||||
| 		setDestroyMethodNames(DisposableBeanAdapter | ||||
| 				.inferDestroyMethodsIfNecessary(getResolvableType().toClass(), this)); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Register an externally managed configuration destruction method — | ||||
| 	 * for example, a method annotated with JSR-250's | ||||
|  |  | |||
|  | @ -90,19 +90,6 @@ class InitDestroyAnnotationBeanPostProcessorTests { | |||
| 		assertThat(mergedBeanDefinition.getDestroyMethodNames()).containsExactly("close"); | ||||
| 	} | ||||
| 
 | ||||
| 	@Test | ||||
| 	void processAheadOfTimeWhenHasInferredDestroyMethodIsRetainedIfMergedBeanDefinitionIsStale() { | ||||
| 		RootBeanDefinition beanDefinition = new RootBeanDefinition(InferredDestroyBean.class); | ||||
| 		beanDefinition.setDestroyMethodNames(AbstractBeanDefinition.INFER_METHOD); | ||||
| 		processAheadOfTime(beanDefinition); | ||||
| 		RootBeanDefinition mergedBeanDefinition = getMergedBeanDefinition(); | ||||
| 		assertThat(mergedBeanDefinition.getInitMethodNames()).isNull(); | ||||
| 		assertThat(mergedBeanDefinition.getDestroyMethodNames()).containsExactly("close"); | ||||
| 		RootBeanDefinition originalBeanDefinition = (RootBeanDefinition) this.beanFactory.getBeanDefinition("test"); | ||||
| 		assertThat(originalBeanDefinition.getInitMethodNames()).isNull(); | ||||
| 		assertThat(originalBeanDefinition.getDestroyMethodNames()).containsExactly("close"); | ||||
| 	} | ||||
| 
 | ||||
| 	@Test | ||||
| 	void processAheadOfTimeWhenHasInferredDestroyMethodAndNoCandidateDoesNotMutateRootBeanDefinition() { | ||||
| 		RootBeanDefinition beanDefinition = new RootBeanDefinition(NoInitDestroyBean.class); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue