Spring注册对象销毁方法

3

我目前正在将XML Spring配置转换为Java注释,但遇到了一些烦人的情况。

我需要创建3个bean,这些bean在内部使用相同的类,但需要是不同的实例。然而,这些内部bean需要向Spring注册它们的关闭方法。

我想不出如何在Java中完成此操作,而不创建9个bean(这很好,但似乎有点不太对,会污染类)

在XML配置中,它看起来像这样:

<bean class="outer1">
    <constructor-arg>
        <bean class="middle">
            <constructor-arg>
                <bean class="inner" />
            </constructor-arg>
        </bean>
    </constructor-arg>
</bean>
<bean class="outer2">
    <constructor-arg>
        <bean class="middle">
            <constructor-arg>
                <bean class="inner" />
            </constructor-arg>
        </bean>
    </constructor-arg>
</bean>
<bean class="outer3">
    <constructor-arg>
        <bean class="middle">
            <constructor-arg>
                <bean class="inner" />
            </constructor-arg>
        </bean>
    </constructor-arg>
</bean>

你真的想让 middleinner 成为 beans 吗?如果不是,你可以在 getXXX 方法中创建它们。 - talex
为什么不直接在外部bean的Spring注册销毁方法中调用内部bean的关闭方法呢? - Stav Saad
这里有一个可能的解决方案:http://shekhargulati.com/2010/10/30/spring-scoped-proxy-beans-an-alternative-to-method-injection/ - Wand Maker
因为内部/中间实现的接口上没有关闭功能。 - Kehaar
@talex因为我需要调用他们的关闭方法。 - Kehaar
1个回答

4
一种解决方案是:
@Configuration
public class MyConfig{
    @Bean(destroyMethod="cleanup")
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public Inner inner(){
        return new Inner();
    }


    @Bean(destroyMethod="cleanup")
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public Middle middle(){
        return new Middle(inner());
    }

    @Bean
    public Outer outer1(){
        return new Outer(middle());
    }


    @Bean
    public Outer outer2(){
        return new Outer(middle());
    }


    @Bean
    public Outer outer3(){
        return new Outer(middle());
    }
}

来自参考文档

非单例原型作用域的bean部署会导致每次请求该特定bean时创建一个新的bean实例。

这意味着每次调用middle()和inner()方法都会创建一个您的bean的新实例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接