Using load time weaving: apsectj lib with jvm javaagent.
I have an aspect that is created in base classloader but also in the restart classloader, leading to two instances, breaking the singleton aspect pattern.
The first instance is created when the jCacheCacheManager
bean is created (using AppClassLoader)
Stacktrace
<init>:28, CacheListenerAspect (pse.cache)
ajc$postClinit:1, CacheListenerAspect (pse.cache)
<clinit>:21, CacheListenerAspect (pse.cache)
isClosed:423, Eh107Cache (org.ehcache.jsr107)
refreshAllCaches:94, Eh107CacheManager (org.ehcache.jsr107)
<init>:83, Eh107CacheManager (org.ehcache.jsr107)
createCacheManager:161, EhcacheCachingProvider (org.ehcache.jsr107)
getCacheManager:134, EhcacheCachingProvider (org.ehcache.jsr107)
getCacheManager:97, EhcacheCachingProvider (org.ehcache.jsr107)
buildCacheManager:64, CacheConfiguration (pse.cache)
getCacheManagerInstance:69, CacheConfiguration (pse.cache)
jCacheCacheManager:115, CacheConfiguration (pse.cache)
CGLIB$jCacheCacheManager$3:-1, CacheConfiguration$$EnhancerBySpringCGLIB$$bb87927d (pse.cache)
invoke:-1, CacheConfiguration$$EnhancerBySpringCGLIB$$bb87927d$$FastClassBySpringCGLIB$$c70d12 (pse.cache)
invokeSuper:244, MethodProxy (org.springframework.cglib.proxy)
intercept:331, ConfigurationClassEnhancer$BeanMethodInterceptor (org.springframework.context.annotation)
jCacheCacheManager:-1, CacheConfiguration$$EnhancerBySpringCGLIB$$bb87927d (pse.cache)
invoke0:-1, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:62, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:43, DelegatingMethodAccessorImpl (jdk.internal.reflect)
invoke:566, Method (java.lang.reflect)
instantiate:154, SimpleInstantiationStrategy (org.springframework.beans.factory.support)
instantiate:653, ConstructorResolver (org.springframework.beans.factory.support)
instantiateUsingFactoryMethod:486, ConstructorResolver (org.springframework.beans.factory.support)
instantiateUsingFactoryMethod:1334, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBeanInstance:1177, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:564, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:524, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:335, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, 2046928591 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$343)
getSingleton:234, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:333, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:208, AbstractBeanFactory (org.springframework.beans.factory.support)
resolveCandidate:276, DependencyDescriptor (org.springframework.beans.factory.config)
doResolveDependency:1380, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveDependency:1300, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveAutowiredArgument:887, ConstructorResolver (org.springframework.beans.factory.support)
createArgumentArray:791, ConstructorResolver (org.springframework.beans.factory.support)
instantiateUsingFactoryMethod:541, ConstructorResolver (org.springframework.beans.factory.support)
instantiateUsingFactoryMethod:1334, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBeanInstance:1177, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:564, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:524, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:335, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, 2046928591 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$343)
getSingleton:234, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:333, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:208, AbstractBeanFactory (org.springframework.beans.factory.support)
doGetBean:322, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:208, AbstractBeanFactory (org.springframework.beans.factory.support)
resolveReference:330, BeanDefinitionValueResolver (org.springframework.beans.factory.support)
resolveValueIfNecessary:113, BeanDefinitionValueResolver (org.springframework.beans.factory.support)
resolveConstructorArguments:693, ConstructorResolver (org.springframework.beans.factory.support)
instantiateUsingFactoryMethod:510, ConstructorResolver (org.springframework.beans.factory.support)
instantiateUsingFactoryMethod:1334, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBeanInstance:1177, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:564, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:524, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:335, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, 2046928591 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$343)
getSingleton:234, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:333, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:208, AbstractBeanFactory (org.springframework.beans.factory.support)
resolveCandidate:276, DependencyDescriptor (org.springframework.beans.factory.config)
doResolveDependency:1380, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveDependency:1300, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveFieldValue:657, AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement (org.springframework.beans.factory.annotation)
inject:640, AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement (org.springframework.beans.factory.annotation)
inject:119, InjectionMetadata (org.springframework.beans.factory.annotation)
postProcessProperties:399, AutowiredAnnotationBeanPostProcessor (org.springframework.beans.factory.annotation)
populateBean:1413, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:601, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:524, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:335, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, 2046928591 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$343)
getSingleton:234, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:333, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:208, AbstractBeanFactory (org.springframework.beans.factory.support)
resolveCandidate:276, DependencyDescriptor (org.springframework.beans.factory.config)
doResolveDependency:1380, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveDependency:1300, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveFieldValue:657, AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement (org.springframework.beans.factory.annotation)
inject:640, AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement (org.springframework.beans.factory.annotation)
inject:119, InjectionMetadata (org.springframework.beans.factory.annotation)
postProcessProperties:399, AutowiredAnnotationBeanPostProcessor (org.springframework.beans.factory.annotation)
populateBean:1413, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:601, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:524, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:335, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, 2046928591 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$343)
getSingleton:234, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:333, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:208, AbstractBeanFactory (org.springframework.beans.factory.support)
instantiateUsingFactoryMethod:410, ConstructorResolver (org.springframework.beans.factory.support)
instantiateUsingFactoryMethod:1334, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBeanInstance:1177, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:564, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:524, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:335, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, 2046928591 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$343)
getSingleton:234, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:333, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:213, AbstractBeanFactory (org.springframework.beans.factory.support)
getOrderedBeansOfType:212, ServletContextInitializerBeans (org.springframework.boot.web.servlet)
addAsRegistrationBean:175, ServletContextInitializerBeans (org.springframework.boot.web.servlet)
addAsRegistrationBean:170, ServletContextInitializerBeans (org.springframework.boot.web.servlet)
addAdaptableBeans:155, ServletContextInitializerBeans (org.springframework.boot.web.servlet)
<init>:87, ServletContextInitializerBeans (org.springframework.boot.web.servlet)
getServletContextInitializerBeans:259, ServletWebServerApplicationContext (org.springframework.boot.web.servlet.context)
selfInitialize:233, ServletWebServerApplicationContext (org.springframework.boot.web.servlet.context)
onStartup:-1, 1844667835 (org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext$$Lambda$661)
onStartup:53, TomcatStarter (org.springframework.boot.web.embedded.tomcat)
startInternal:5166, StandardContext (org.apache.catalina.core)
start:183, LifecycleBase (org.apache.catalina.util)
call:1384, ContainerBase$StartChild (org.apache.catalina.core)
call:1374, ContainerBase$StartChild (org.apache.catalina.core)
run:264, FutureTask (java.util.concurrent)
execute:75, InlineExecutorService (org.apache.tomcat.util.threads)
submit:140, AbstractExecutorService (java.util.concurrent)
startInternal:909, ContainerBase (org.apache.catalina.core)
startInternal:843, StandardHost (org.apache.catalina.core)
start:183, LifecycleBase (org.apache.catalina.util)
call:1384, ContainerBase$StartChild (org.apache.catalina.core)
call:1374, ContainerBase$StartChild (org.apache.catalina.core)
run:264, FutureTask (java.util.concurrent)
execute:75, InlineExecutorService (org.apache.tomcat.util.threads)
submit:140, AbstractExecutorService (java.util.concurrent)
startInternal:909, ContainerBase (org.apache.catalina.core)
startInternal:262, StandardEngine (org.apache.catalina.core)
start:183, LifecycleBase (org.apache.catalina.util)
startInternal:434, StandardService (org.apache.catalina.core)
start:183, LifecycleBase (org.apache.catalina.util)
startInternal:930, StandardServer (org.apache.catalina.core)
start:183, LifecycleBase (org.apache.catalina.util)
start:486, Tomcat (org.apache.catalina.startup)
initialize:123, TomcatWebServer (org.springframework.boot.web.embedded.tomcat)
<init>:104, TomcatWebServer (org.springframework.boot.web.embedded.tomcat)
getTomcatWebServer:450, TomcatServletWebServerFactory (org.springframework.boot.web.embedded.tomcat)
getWebServer:199, TomcatServletWebServerFactory (org.springframework.boot.web.embedded.tomcat)
createWebServer:181, ServletWebServerApplicationContext (org.springframework.boot.web.servlet.context)
onRefresh:159, ServletWebServerApplicationContext (org.springframework.boot.web.servlet.context)
refresh:577, AbstractApplicationContext (org.springframework.context.support)
refresh:144, ServletWebServerApplicationContext (org.springframework.boot.web.servlet.context)
refresh:769, SpringApplication (org.springframework.boot)
refresh:761, SpringApplication (org.springframework.boot)
refreshContext:426, SpringApplication (org.springframework.boot)
run:326, SpringApplication (org.springframework.boot)
main:64, Application (pse)
invoke0:-1, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:62, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:43, DelegatingMethodAccessorImpl (jdk.internal.reflect)
invoke:566, Method (java.lang.reflect)
run:49, RestartLauncher (org.springframework.boot.devtools.restart)
And the second when I call Aspects.aspectof(CacheListenerAspect.class)
from my spring service bean constructor (using RestartClassLoader).
Tried using restart.include
for my classes to be pulled up into the restart classloader, but still creates two instances.
Using restart.exclude
results in failed autowiring: non-public interface is not defined by the given loader
.
I'm only using devtools for the custom dev properties feature.
Comment From: wilkinsona
Thanks for the report. Unfortunately, I'm finding it hard to envisage what you're doing and why from the information you've provided thus far. If you would like us to spend some more time investigating, please spend some time providing a complete yet minimal sample that reproduces the problem. You can share it with us by pushing it to a separate repository on GitHub or by zipping it up and attaching it to this issue.
I'm only using devtools for the custom dev properties feature.
In that case, you may want to disable restart completely.
Comment From: cdalexndr
I was already using spring.devtools.restart.enabled=false
in my properties file, but the restart classloader was still created.
Changed to using jvm arg -Dspring.devtools.restart.enabled=false
and now it works as expected.