java – 有没有办法指定Spring在初始化时应该使用bean然后立即丢弃?

我很想知道是否有一个接口可以告诉Spring启动一个特定的bean,调用它的初始化过程(通过afterPropertiesSet()作为InitializingBean,或者通过init方法,或者其他方式),然后扔掉它.

我的用例是一个简单的“健全检查器”,它将在启动Web应用程序时检查数据库中的有效值.虽然我们的特定bean的开销很小,但在应用程序上下文中保持bean永远是没有意义的,因为一旦bean初始化,就不再需要了.

我确定这种行为还有其他用例,但我还没有在Spring中找到这样的东西.

特别是,我在Spring的Java变体中寻找它,我可以根据需要访问3.x及以上.

编辑:根据接受的答案,以下是一个简单的黑客提供解决方案:

public final class NullReturningBeanPostProcessor implements BeanPostProcessor {

    private List<String> beanNamesToDiscard = new ArrayList<String>();

    /**
     * Creates a new {@link NullReturningBeanPostProcessor} instance.
     */
    public NullReturningBeanPostProcessor() {
    super();
    }

    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    return bean;
    }

    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    if (beanNamesToDiscard.contains(beanName)) {
        return null;
    }
    return bean;
    }

    public void setBeanNamesToDiscard(List<String> beanNamesToDiscard) {
    if (beanNamesToDiscard != null) {
        this.beanNamesToDiscard = beanNamesToDiscard;
    }
    }
}

将此bean后处理器与适当的bean放在应用程序上下文中将使它们为空,并且在初始化之后有资格进行垃圾回收.遗憾的是,bean配置元数据仍将保留在应用程序上下文中.

最佳答案
为了实现这一点,我将使bean实现BeanPostProcessor,然后:

@Override
Object postProcessAfterInitialization(Object bean, String beanName)
    throws BeansException {
    return bean == this ? null : bean;
}

这应该导致ApplicationContext丢弃它,但只有在它执行了初始化步骤之后.

请注意,您还需要实现postProcessBeforeInitialization(),并且只需编写return bean;.

更新:这不起作用.但不是由于MetroidFan2002的评论(见下文),而是由于JavaDoc的另一部分:

ApplicationContexts can autodetect BeanPostProcessor beans in their
bean definitions and apply them to any beans subsequently created.

显然你不能将BeanPostProcessor应用于自身.
对不起,误报:)

转载注明原文:java – 有没有办法指定Spring在初始化时应该使用bean然后立即丢弃? - 代码日志