PostConstruct在客戶端運行biz方法之前被調用。這意味着如果bean沒有被合併,容器將實例化bean,做注入,調用@PostConstruct方法,然後允許biz方法運行。
在彙集的情況下,每次從池中取出bean時都會運行@PostConstruct方法。對於無狀態bean,這將在每個方法調用之間進行。有了Stateful bean,這將在客戶端查找或注入之後進行。
如果您需要在應用程序部署上運行某些東西,您的選擇將取決於您擁有的Java EE版本。
對於Java EE 6,您可以在包含@PostConstruct方法的@Singleton EJB上使用@Startup。
對於Java EE 5和以前的版本,您必須在Web歸檔中使用ServletContextListener。如果需要,您可以讓ServletContextListener調用EJB。
但是,什麼可能是一個更重要的問題是你想在哪裏加載這些應用程序設置?如果您正在處理非集羣單JVM配置,那麼您可能需要將它們加載到某種類型的單例中。在Java EE 5中,您必須自己實現單例設計模式,或者在EE 6中使用@Singleton EJB類型。
我認爲Tim明白了,容器並不是每次都在SAME EJB實例上調用PostConstruct註釋的方法,但是它實際上爲它接收到的每個調用實例化一個新的EJB實例,可能是由於某些池設置。 – AleIla 2009-07-11 11:40:22
不知道在這個特定情況下它是否會有所幫助,但是如果您使用社區版本的JBoss(例如5.1 AS),請確保通過安裝來自http://www.jboss的最新EJB3插件將其升級爲使用最新的EJB3代碼。組織/ EJB3。付費版本的JBoss會自動支付,但對於社區您需要手動升級它。 – 2009-10-06 10:08:14