Spring Child Context关闭Parent

时间:2015-09-04 16:46:11

标签: java spring spring-boot spring-aop

我有一个使用子/父上下文关系的Spring应用程序。这样做的原因是为了确保子上下文从父级继承bean /资源,然后添加更多bean /资源以根据需要覆盖它们。但是,当子上下文关闭(退出try / catch范围)时,它开始对它引用的所有bean进行清理,包括父作用域中的那些bean。这是不可取的,因为我需要重用那个父上下文来创建另一个子上下文,但它现在是垃圾,因为它包含一堆已处理/关闭的bean。

问题:

  1. 这是子上下文的理想行为,它应该清理父bean吗?如果是这样,为什么?

  2. 我希望子上下文只清理它直接定义的bean,而不是继承的bean。这可能吗?

  3. 以下是一些相关代码:

    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);
        ...
    

1 个答案:

答案 0 :(得分:0)

事实证明问题来自于子上下文的@EnableSpringConfigured注释。模糊地描述here

当子上下文关闭时,静态BeanConfigurerSupport bean将关闭,不再可用。但是,因为它是静态的(也由父上下文使用),所以任何未来的@Configurable bean都无法配置。

如果有人可以评论这是一个错误还是想要的行为,我会很高兴。