2012-03-19 48 views
0

阅读临春2.5我有一个问题,发生了什么事情在第90页i列表4-19。为什么打电话preInstantiateSingletons()

他们展示了一个“ShutdownHook”的例子,他们在这里创建一个bean工厂,然后调用factory.preInstantiateSingletons(),然后以正常的方式从工厂获得bean。

默认情况下,Spring会根据需要实例化单例bean。这是一个问题 为ShutdownHookBean,因为它需要被实例化为 注册本身作为关机挂钩。调用 preInstantiateSingletons()会导致Spring遍历其所有的单例bean定义并创建实例,调用任何回调方法作为合适的。

我不明白。无论如何,当你打电话给getBean(...)时,是不是创建了这个bean?为什么需要调用preInstantiateSingletons()呢?

回答

2

问题是,您可能会创建从未直接引用的bean(如ShutdownHookBean)(即从未调用getBean()来强制实例化)。通过允许您强制初始化您可以确保调用

Runtime.getRuntime().addShutdownHook(myShutdownHookThread); 

调用是在myShutdownHookThread的代码将在JVM关闭时调用。

我还没有看到专业春书的代码,但说你需要注册一个关闭钩子,调用一个由spring创建的服务。你决定做一个课,ShutdownHookBean

另外,假设你需要在关机代码中参考MyService

你豆可能是这样的:

public class ShutdownHookBean implements Runnable { 

    private final MyService service; 

    //MyService wired in by spring, (could be @Autowired etc). 
    public ShutdownHookBean(MyService service) { 

     this.service = service; 

     Runtime.getRuntime().addShutdownHook(this); 

    } 

    public void run() { 
      service.performShutdown(); 
    } 

}  

ShutdownHookBean被弹簧创建,只有当getBean()被调用,但因为没有其他bean需要引用它,从来都没有来电getBean()。因此,您需要强制安装ShutdownHookBean才能拨打电话addShutdownHook()

是弹簧想到另一种使用情况是,你可能希望强制豆初始化启动,以验证任何运行时配置和故障快,如果有

+0

你说的永远不会直接引用意味着问题是什么?你不需要获得它的引用,以便将它作为shutdownhook添加吗? – LuckyLuke 2012-03-19 09:47:43

+0

@Viper - 我充实了这个例子 – sw1nn 2012-03-19 11:33:18

相关问题