From 2b017fe540130b77b10fe57aebb6745686a9863b Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 10 Mar 2021 16:37:31 +0100 Subject: [PATCH] Apply original ClassLoader in AbstractAdvisingBeanPostProcessor as well See gh-26601 --- .../framework/AbstractAdvisingBeanPostProcessor.java | 11 +++++++++-- .../framework/autoproxy/AbstractAutoProxyCreator.java | 9 +++++---- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/spring-aop/src/main/java/org/springframework/aop/framework/AbstractAdvisingBeanPostProcessor.java b/spring-aop/src/main/java/org/springframework/aop/framework/AbstractAdvisingBeanPostProcessor.java index a3a87f2117..d941bdac4c 100644 --- a/spring-aop/src/main/java/org/springframework/aop/framework/AbstractAdvisingBeanPostProcessor.java +++ b/spring-aop/src/main/java/org/springframework/aop/framework/AbstractAdvisingBeanPostProcessor.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,6 +22,7 @@ import java.util.concurrent.ConcurrentHashMap; import org.springframework.aop.Advisor; import org.springframework.aop.support.AopUtils; import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.core.SmartClassLoader; import org.springframework.lang.Nullable; /** @@ -89,7 +90,13 @@ public abstract class AbstractAdvisingBeanPostProcessor extends ProxyProcessorSu } proxyFactory.addAdvisor(this.advisor); customizeProxyFactory(proxyFactory); - return proxyFactory.getProxy(getProxyClassLoader()); + + // Use original ClassLoader if bean class not locally loaded in overriding class loader + ClassLoader classLoader = getProxyClassLoader(); + if (classLoader instanceof SmartClassLoader && classLoader != bean.getClass().getClassLoader()) { + classLoader = ((SmartClassLoader) classLoader).getOriginalClassLoader(); + } + return proxyFactory.getProxy(classLoader); } // No proxy needed. diff --git a/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/AbstractAutoProxyCreator.java b/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/AbstractAutoProxyCreator.java index 52a2678604..79c1fe20ca 100644 --- a/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/AbstractAutoProxyCreator.java +++ b/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/AbstractAutoProxyCreator.java @@ -459,11 +459,12 @@ public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport proxyFactory.setPreFiltered(true); } - ClassLoader targetClassLoader = getProxyClassLoader(); - if (targetClassLoader instanceof SmartClassLoader && targetClassLoader != beanClass.getClassLoader()) { - targetClassLoader = ((SmartClassLoader) targetClassLoader).getOriginalClassLoader(); + // Use original ClassLoader if bean class not locally loaded in overriding class loader + ClassLoader classLoader = getProxyClassLoader(); + if (classLoader instanceof SmartClassLoader && classLoader != beanClass.getClassLoader()) { + classLoader = ((SmartClassLoader) classLoader).getOriginalClassLoader(); } - return proxyFactory.getProxy(targetClassLoader); + return proxyFactory.getProxy(classLoader); } /**