|
|
|
@ -26,6 +26,7 @@ import org.apache.commons.logging.Log; |
|
|
|
import org.apache.commons.logging.LogFactory; |
|
|
|
import org.apache.commons.logging.LogFactory; |
|
|
|
|
|
|
|
|
|
|
|
import org.springframework.aop.scope.ScopedProxyFactoryBean; |
|
|
|
import org.springframework.aop.scope.ScopedProxyFactoryBean; |
|
|
|
|
|
|
|
import org.springframework.aot.AotDetector; |
|
|
|
import org.springframework.asm.Opcodes; |
|
|
|
import org.springframework.asm.Opcodes; |
|
|
|
import org.springframework.asm.Type; |
|
|
|
import org.springframework.asm.Type; |
|
|
|
import org.springframework.beans.factory.BeanDefinitionStoreException; |
|
|
|
import org.springframework.beans.factory.BeanDefinitionStoreException; |
|
|
|
@ -138,26 +139,22 @@ class ConfigurationClassEnhancer { |
|
|
|
Enhancer enhancer = new Enhancer(); |
|
|
|
Enhancer enhancer = new Enhancer(); |
|
|
|
if (classLoader != null) { |
|
|
|
if (classLoader != null) { |
|
|
|
enhancer.setClassLoader(classLoader); |
|
|
|
enhancer.setClassLoader(classLoader); |
|
|
|
|
|
|
|
if (classLoader instanceof SmartClassLoader smartClassLoader && |
|
|
|
|
|
|
|
smartClassLoader.isClassReloadable(configSuperClass)) { |
|
|
|
|
|
|
|
enhancer.setUseCache(false); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
enhancer.setSuperclass(configSuperClass); |
|
|
|
enhancer.setSuperclass(configSuperClass); |
|
|
|
enhancer.setInterfaces(new Class<?>[] {EnhancedConfiguration.class}); |
|
|
|
enhancer.setInterfaces(new Class<?>[] {EnhancedConfiguration.class}); |
|
|
|
enhancer.setUseFactory(false); |
|
|
|
enhancer.setUseFactory(false); |
|
|
|
enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE); |
|
|
|
enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE); |
|
|
|
enhancer.setAttemptLoad(!isClassReloadable(configSuperClass, classLoader)); |
|
|
|
enhancer.setAttemptLoad(enhancer.getUseCache() && AotDetector.useGeneratedArtifacts()); |
|
|
|
enhancer.setStrategy(new BeanFactoryAwareGeneratorStrategy(classLoader)); |
|
|
|
enhancer.setStrategy(new BeanFactoryAwareGeneratorStrategy(classLoader)); |
|
|
|
enhancer.setCallbackFilter(CALLBACK_FILTER); |
|
|
|
enhancer.setCallbackFilter(CALLBACK_FILTER); |
|
|
|
enhancer.setCallbackTypes(CALLBACK_FILTER.getCallbackTypes()); |
|
|
|
enhancer.setCallbackTypes(CALLBACK_FILTER.getCallbackTypes()); |
|
|
|
return enhancer; |
|
|
|
return enhancer; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* Checks whether the given configuration class is reloadable. |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
private boolean isClassReloadable(Class<?> configSuperClass, @Nullable ClassLoader classLoader) { |
|
|
|
|
|
|
|
return (classLoader instanceof SmartClassLoader smartClassLoader && |
|
|
|
|
|
|
|
smartClassLoader.isClassReloadable(configSuperClass)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Uses enhancer to generate a subclass of superclass, |
|
|
|
* Uses enhancer to generate a subclass of superclass, |
|
|
|
* ensuring that callbacks are registered for the new subclass. |
|
|
|
* ensuring that callbacks are registered for the new subclass. |
|
|
|
@ -548,7 +545,7 @@ class ConfigurationClassEnhancer { |
|
|
|
Enhancer enhancer = new Enhancer(); |
|
|
|
Enhancer enhancer = new Enhancer(); |
|
|
|
enhancer.setSuperclass(factoryBean.getClass()); |
|
|
|
enhancer.setSuperclass(factoryBean.getClass()); |
|
|
|
enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE); |
|
|
|
enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE); |
|
|
|
enhancer.setAttemptLoad(true); |
|
|
|
enhancer.setAttemptLoad(AotDetector.useGeneratedArtifacts()); |
|
|
|
enhancer.setCallbackType(MethodInterceptor.class); |
|
|
|
enhancer.setCallbackType(MethodInterceptor.class); |
|
|
|
|
|
|
|
|
|
|
|
// Ideally create enhanced FactoryBean proxy without constructor side effects,
|
|
|
|
// Ideally create enhanced FactoryBean proxy without constructor side effects,
|
|
|
|
|