Exception
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'Plugin#UserServiceImpl': Could not generate CGLIB subclass of class test250410.service.impl.UserServiceImpl: Common causes of this problem include using a final class or a non-visible class
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:607)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
at com.allstar.dev.SpringTest.test01(SpringTest.java:362)
Caused by: org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class test250410.service.impl.UserServiceImpl: Common causes of this problem include using a final class or a non-visible class
at org.springframework.aop.framework.CglibAopProxy.buildProxy(CglibAopProxy.java:230)
at org.springframework.aop.framework.CglibAopProxy.getProxy(CglibAopProxy.java:163)
at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:110)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.buildProxy(AbstractAutoProxyCreator.java:519)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(AbstractAutoProxyCreator.java:466)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:371)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:320)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:438)
Caused by: org.springframework.cglib.core.CodeGenerationException: java.lang.ClassNotFoundException-->test250410.service.impl.UserServiceImpl$$SpringCGLIB$$0
at org.springframework.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:380)
at org.springframework.cglib.proxy.Enhancer.generate(Enhancer.java:575)
at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData.lambda$new$1(AbstractClassGenerator.java:107)
at org.springframework.cglib.core.internal.LoadingCache.lambda$createEntry$1(LoadingCache.java:52)
at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:317)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
at --- Async.Stack.Trace --- (captured by IntelliJ IDEA debugger)
Caused by: java.lang.ClassNotFoundException: test250410.service.impl.UserServiceImpl$$SpringCGLIB$$0
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:534)
at java.base/java.lang.Class.forName(Class.java:513)
at org.springframework.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:559)
at org.springframework.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:371)
Code
The UserServiceImpl class in the jar:
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, UserEntity>
implements UserService {
@Transactional(rollbackFor = Exception.class)
public List<UserEntity> test(String username) {
System.out.println(DbOperation.getCurrentConnection());
return lambdaQuery().eq(!StringUtils.isBlank(username), UserEntity::getUsername, username)
.list();
}
}
Another springboot program:
URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{
file.toURI().toURL()
}, SpringBootApplication.class.getClassLoader());
Class<?> componentClass = urlClassLoader.loadClass(xxx);
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(componentClass);
beanDefinitionBuilder.setScope(BeanDefinition.SCOPE_SINGLETON);
beanDefinitionBuilder.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);
BeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();
// beanDefinition.setSynthetic(true);
defaultListableBeanFactory.registerBeanDefinition(componentName, beanDefinition);
// Exception occurred while getting Bean
defaultListableBeanFactory.getBean(componentName);
Place of investigation: org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator:515
private Object buildProxy(Class<?> beanClass, @Nullable String beanName,
@Nullable Object[] specificInterceptors, TargetSource targetSource, boolean classOnly) {
// ...
ClassLoader classLoader = getProxyClassLoader();
if (classLoader instanceof SmartClassLoader smartClassLoader && classLoader != beanClass.getClassLoader()) {
classLoader = smartClassLoader.getOriginalClassLoader();
}
return (classOnly ? proxyFactory.getProxyClass(classLoader) : proxyFactory.getProxy(classLoader));
}
ClassLoader classLoader = getProxyClassLoader(); I obtained the ClassLoader for AppClassLoader instead of beanClass. I would like to ask about its usage here