最简短的回答你的问题,当然这是一个好主意,有可能使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/ –