我创建了一个实现ServletContextAttributeListener
的类,没有默认构造函数和容器抱怨:
严重:配置.....的应用程序监听器时出错 java.lang.InstantiationException:...
所以除了参数化构造函数之外我创建了一个默认构造函数,一切正常。由于容器需要默认构造,我怀疑容器正在创建类的新实例而不使用已创建的实例。但是插入一个静态对象计数器成员数据,我发现这种怀疑是真的。
我的问题是:如果我想在ServletContextAttributeEvent
更新我的对象的成员数据,我可以以线程安全的方式进行吗?容器创建新对象的副作用是什么?解决方法是什么?
答案 0 :(得分:2)
是的,容器会为您安装。是的,这个对象对于整个webapp(在JVM中)是唯一的,你必须确保一切都以线程安全的方式完成,使用同步。我没有看到任何副作用或解决方法。这就是它应该如何。
您似乎混淆了属性和侦听器。您可以设置和删除任何类型的任何属性到servlet上下文。这些属性应不实施ServletContextAttributeListener
。
另一方面,您也可以通过web.xml注册侦听器,或者调用addListener
ServletContext
方法之一。那些听众是不 servlet上下文属性。
如果已向servlet上下文注册了一个ServletContextAttributeListener
,那么每次在servlet上下文中设置或删除任何属性时,都会调用侦听器的相应方法。已设置或删除的属性的名称和值将位于侦听器接收的事件内。
因此,由于容器并行处理多个请求,并且由于每个请求都可以从servlet上下文中设置或删除属性,因此侦听器将被并行多次调用,因此必须是线程安全的。