最簡短的回答你的問題,當然這是一個好主意,有可能使EJB來如servlet和EJB 3.1的工作,我們補充說,能做到這些組件:@Singleton
的@Singleton
豆可以多線程等小服務程序,或者:
- 上的方法使用
@ConcurrencyManagement(BEAN)
- 使用
@ConcurrencyManagement(CONTAINER)
與@Lock(READ)
沿對於非線程安全的方法,需要併發性並且@Lock(WRITE)
。
Servlets多年來一直存在的EJB從來沒有過的另一件事是<load-on-startup>
,它允許Servlet在應用程序啓動時急切加載並執行工作。
爲了配合我們添加了@Startup
註釋可以添加到任何@Singleton
EJB,並使其在應用程序啓動時啓動的Servlet <load-on-start>
。這些bean將在應用程序啓動時調用它們的@PostConstruct
方法,並在應用程序關閉時調用它們的@PreDestroy
。
除了使用數量(<load-on-startup>1</load-on-startup>
),以決定在與@Startup
開始註解的bean,你可以註釋豆@DependsOn
,並指定需要註解的bean之前啓動Bean的列表的順序。
而我們在EJB 3.1中爲了對齊Servlet和EJB所做的一個鮮爲人知的理解方面當然是允許將EJB打包在.war
文件中 - 這不是那麼不爲人知的部分 - 而且當我們這樣做時我們悄悄地改變了java:comp/env
的定義以匹配Servlet方法。
在EJB 3.1之前,沒有辦法讓兩個EJB共享一個java:comp/env
命名空間(java:comp/env
在EJB規範中是bean範圍的)。相比之下,Servlet從來沒有任何方法讓單個Servlet擁有自己的專用java:comp/env
名稱空間(java:comp/env
在Servlet規範中是模塊範圍的)。因此,在EJB 3.1中,包裝在戰爭中的EJB與Web應用中的所有其他Servlet和EJB具有相同的模塊範圍java:comp/env
命名空間,這與EJB在打包時獲得的bean範圍java:comp/env
命名空間形成鮮明對比戰爭之外的EAR。我們幾周來就這個問題進行了辯論。
不錯的啤酒時間微不足道的測驗你的朋友。
他們爲什麼要一致?他們做了完全不同的事情。 – EJP
@EJP,對,他們確實解決了不同的目的,但他們在無狀態方面有相似之處。有了這種相似性,EJB可以通過擁有線程而不是僅具有實例來提高性能。 –
如果你對一個servlet /一個實例感興趣 - 你看看這篇文章:http://piotrnowicki.com/2012/04/one-servlet-instance-to-rule-them-all/ –