我有一个使用子/父上下文关系的Spring应用程序。这样做的原因是为了确保子上下文从父级继承bean /资源,然后添加更多bean /资源以根据需要覆盖它们。但是,当子上下文关闭(退出try / catch范围)时,它开始对它引用的所有bean进行清理,包括父作用域中的那些bean。这是不可取的,因为我需要重用那个父上下文来创建另一个子上下文,但它现在是垃圾,因为它包含一堆已处理/关闭的bean。
问题:
这是子上下文的理想行为,它应该清理父bean吗?如果是这样,为什么?
我希望子上下文只清理它直接定义的bean,而不是继承的bean。这可能吗?
以下是一些相关代码:
private AbstractApplicationContext createChildContext(Path workspacePath, String catalogPath, boolean force, Map<String, String> buildOptions) {
// Set the properties to pass into the new context
Properties props=new Properties();
props.setProperty("workspacePath", workspacePath.toString());
props.setProperty("databasePath", workspacePath.toString() + File.separator + "data");
props.setProperty("catalog", catalogPath);
props.setProperty("force",String.valueOf(force));
PropertiesPropertySource pps=new PropertiesPropertySource("properties",props);
// Create new context
AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext();
context.setParent(applicationContext);
context.getEnvironment().getPropertySources().addFirst(pps);
context.scan(Neo4jConfig.class.getPackage().getName());
context.register(Neo4jConfig.class);
ConfigurableListableBeanFactory beans = context.getBeanFactory();
BuildConfigurationService buildConfiguration = (BuildConfigurationService)beans.createBean(BuildConfigurationService.class);
buildConfiguration.setBuildConfiguration(buildOptions);
beans.registerSingleton("buildConfiguration", buildConfiguration);
context.refresh();
return context;
}
在Neo4jConfig中,我们这样做......
@Configuration
@EnableAutoConfiguration
@ComponentScan
@EnableNeo4jRepositories
@EnableTransactionManagement
@EnableSpringConfigured
@EnableCaching(mode=AdviceMode.ASPECTJ)
@Import({ConversionServiceConfiguration.class})
public class Neo4jConfig extends Neo4jConfiguration {
...
@Bean GraphDatabaseService graphDatabaseService(@Value(value = "${databasePath}") String databasePath) {
logger.debug("Creating database using '{}' for the database path.",databasePath);
GraphDatabaseService graphDB = new GraphDatabaseFactory().newEmbeddedDatabase(databasePath);
...
答案 0 :(得分:0)
事实证明问题来自于子上下文的@EnableSpringConfigured
注释。模糊地描述here。
当子上下文关闭时,静态BeanConfigurerSupport
bean将关闭,不再可用。但是,因为它是静态的(也由父上下文使用),所以任何未来的@Configurable
bean都无法配置。
如果有人可以评论这是一个错误还是想要的行为,我会很高兴。