为什么ServletContextAttributeListener需要默认构造函数?

时间:2011-10-17 06:46:24

标签: java-ee servlets

我创建了一个实现ServletContextAttributeListener的类,没有默认构造函数和容器抱怨:

  

严重:配置.....的应用程序监听器时出错   java.lang.InstantiationException:...

所以除了参数化构造函数之外我创建了一个默认构造函数,一切正常。由于容器需要默认构造,我怀疑容器正在创建类的新实例而不使用已创建的实例。但是插入一个静态对象计数器成员数据,我发现这种怀疑是真的。

我的问题是:如果我想在ServletContextAttributeEvent更新我的对象的成员数据,我可以以线程安全的方式进行吗?容器创建新对象的副作用是什么?解决方法是什么?

1 个答案:

答案 0 :(得分:2)

是的,容器会为您安装。是的,这个对象对于整个webapp(在JVM中)是唯一的,你必须确保一切都以线程安全的方式完成,使用同步。我没有看到任何副作用或解决方法。这就是它应该如何。

您似乎混淆了属性和侦听器。您可以设置和删除任何类型的任何属性到servlet上下文。这些属性应实施ServletContextAttributeListener

另一方面,您也可以通过web.xml注册侦听器,或者调用addListener ServletContext方法之一。那些听众是 servlet上下文属性。

如果已向servlet上下文注册了一个ServletContextAttributeListener,那么每次在servlet上下文中设置或删除任何属性时,都会调用侦听器的相应方法。已设置或删除的属性的名称和值将位于侦听器接收的事件内。

因此,由于容器并行处理多个请求,并且由于每个请求都可以从servlet上下文中设置或删除属性,因此侦听器将被并行多次调用,因此必须是线程安全的。