我有一个带有层树的JPMS应用程序.在Layer C
上,我需要创建Spring上下文,而Spring框架位于Layer B
上:
boot layer
|- Layer B with Spring framework.
|- Layer C where I need to create my context
组件:
@Component
public class ApplicationContextHolder implements ApplicationContextAware {
private static ConfigurableApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
ApplicationContextHolder.applicationContext = (ConfigurableApplicationContext) applicationContext;
}
public static ConfigurableApplicationContext getApplicationContext() {
return applicationContext;
}
}
请注意,情况并非如此.
@Configuration
@ComponentScan(basePackageClasses = {
ApplicationContextHolder.class
})
public class ContextConfig {
}
创建上下文:
System.out.println("ThreadContextClassLoadere:" + Thread.currentThread().getContextClassLoader());
System.out.println("This classLoader:" + this.getClass().getClassLoader());
var clazz = this.getClass().getClassLoader().loadClass("org.springframework.context.ApplicationContextAware");
System.out.println("RESULT:" + clazz);
iocContext = new AnnotationConfigApplicationContext();
iocContext.register(ContextConfig.class);
iocContext.setClassLoader(this.getClass().getClassLoader());
iocContext.refresh();
结果:
ThreadContextClassLoadere:jdk.internal.loader.Loader@63fcbf75
This classLoader:jdk.internal.loader.Loader@63fcbf75
RESULT:interface org.springframework.context.ApplicationContextAware
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.foo.ContextConfig]
at spring.context@6.0.13/org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:178)
at spring.context@6.0.13/org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:415)
at spring.context@6.0.13/org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:287)
at spring.context@6.0.13/org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:344)
at spring.context@6.0.13/org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:115)
at spring.context@6.0.13/org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:779)
at spring.context@6.0.13/org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:597)
....
Caused by: java.io.FileNotFoundException: class path resource [org/springframework/context/ApplicationContextAware.class] cannot be opened because it does not exist
at spring.core@6.0.13/org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:211)
at spring.core@6.0.13/org.springframework.core.type.classreading.SimpleMetadataReader.getClassReader(SimpleMetadataReader.java:54)
at spring.core@6.0.13/org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:48)
at spring.core@6.0.13/org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:103)
at spring.core@6.0.13/org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:122)
at spring.core@6.0.13/org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:81)
at spring.context@6.0.13/org.springframework.context.annotation.ConfigurationClassParser.asSourceClass(ConfigurationClassParser.java:613)
at spring.context@6.0.13/org.springframework.context.annotation.ConfigurationClassParser$SourceClass.getInterfaces(ConfigurationClassParser.java:939)
at spring.context@6.0.13/org.springframework.context.annotation.ConfigurationClassParser.processInterfaces(ConfigurationClassParser.java:379)
at spring.context@6.0.13/org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:325)
at spring.context@6.0.13/org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:243)
at spring.context@6.0.13/org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:188)
at spring.context@6.0.13/org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:297)
at spring.context@6.0.13/org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:243)
at spring.context@6.0.13/org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:196)
at spring.context@6.0.13/org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:164)
... 16 more
据我所知(我可能是错的)Spring使用其他类加载器.有人能告诉我怎么修吗?