使用特别的自动开始servlet初始化的启动和分享应用程序的数据
-
28-09-2019 - |
题
我需要得到一些结构,并连接到外部资源的/目的/系统的地方和存在的应用范围。
我可以看到两种方式设置的应用程序:
- 压倒一切的
init()
在现有的servlet和所需码有和保持所有造物体内,同servlet。 - 具有某种初始化程序,使用它的
init()
要做的工作。然后储存创建的对象ServletContext
分享我的其他servlet.
其出的上面是更好的方法吗?是否有更好的方式分享的对象之间的servlet?叫他们直接从另一个或所以...?
解决方案
没有两个是更好的方法。Servlet旨在监听HTTP事件(HTTP请求),而不部署活动(startup/shutdown).
CDI/JSF/EJB不可用的?使用 ServletContextListener
@WebListener
public class Config implements ServletContextListener {
public void contextInitialized(ServletContextEvent event) {
// Do stuff during webapp's startup.
}
public void contextDestroyed(ServletContextEvent event) {
// Do stuff during webapp's shutdown.
}
}
如果你不在Servlet3.0但并不能升级,因而不能使用 @WebListener
注释,然后你需要手工登记它在 /WEB-INF/web.xml
如下:
<listener>
<listener-class>com.example.Config</listener-class>
</listener>
来储存和获取对象的应用范围(因此,所有servlet可以进行访问),使用 ServletContext#setAttribute()
和 #getAttribute()
.
这里有一个例子,它可以让听众存储本身的适用范围:
public void contextInitialized(ServletContextEvent event) {
event.getServletContext().setAttribute("config", this);
// ...
}
然后得到它在servlet:
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
Config config = (Config) getServletContext().getAttribute("config");
// ...
}
它也可以在JSP通过EL ${config}
.所以你可以做一个简单的豆。
CDI?使用 @Observes
上 ApplicationScoped.class
import javax.enterprise.context.ApplicationScoped;
@ApplicationScoped
public class Config {
public void init(@Observes @Initialized(ApplicationScoped.class) ServletContext context) {
// Do stuff during webapp's startup.
}
public void destroy(@Observes @Destroyed(ApplicationScoped.class) ServletContext context) {
// Do stuff during webapp's shutdown.
}
}
这是可在通过servlet @Inject
.让它如有必要还 @Named
所以它可以通过 #{config}
在EL。
注意到应,这是新的,因为CDI1.1.如果你还在CDI1.0和不能升级,然后选择另一种方法。
JSF?使用 @ManagedBean(eager=true)
import javax.faces.bean.ManagedBean
import javax.faces.bean.ApplicationScoped;
@ManagedBean(eager=true)
@ApplicationScoped
public class Config {
@PostConstruct
public void init() {
// Do stuff during webapp's startup.
}
@PreDestroy
public void destroy() {
// Do stuff during webapp's shutdown.
}
}
这是可以通过 #{config}
在EL。
EJB?考虑 @Startup
@Singleton
@Startup
@Singleton
public class Config {
@PostConstruct
public void init() {
// Do stuff during webapp's startup.
}
@PreDestroy
public void destroy() {
// Do stuff during webapp's shutdown.
}
}
这是可在通过servlet @EJB
.我说的"考虑",因为你不应该滥用EJB为了启动挂钩。此外, @Singleton
是默认情况下阅读写锁和主要intented事务的东西,如调度背景工作。
参见:
不隶属于 StackOverflow