我很想知道是否有一个接口可以告诉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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
将此bean后处理器与适当的bean放在应用程序上下文中将使它们为空,并且在初始化之后有资格进行垃圾回收.遗憾的是,bean配置元数据仍将保留在应用程序上下文中.
为了实现这一点,我将制作该bean工具BeanPostProcessor
,然后:
@Override
Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
return bean == this ? null : bean;
}
Run Code Online (Sandbox Code Playgroud)
这应该导致ApplicationContext丢弃它,但只有在它执行了初始化步骤之后.
请注意,您还需要实现postProcessBeforeInitialization()
并且只需编写return bean;
.
更新:这不起作用.但不是由于MetroidFan2002的评论(见下文),而是由于JavaDoc的另一部分:
ApplicationContexts可以在其bean定义中自动检测BeanPostProcessor bean,并将它们应用于随后创建的任何bean.
显然你不能将BeanPostProcessor应用于自身.对不起,误报:)
归档时间: |
|
查看次数: |
761 次 |
最近记录: |