我的 Java webapp 中有一堆 servlet 上下文侦听器,每个侦听器都收集有关环境的一些信息。
其中一些依赖于另一个听众收集的信息。但是我无法确定监听器注册和调用的顺序,所以我不得不复制代码。
我知道听众是按照他们在 web.xml 中的顺序注册的,但这对我来说听起来有点模糊,太模糊以至于无法依赖它。
你有提示我如何解决我的问题吗?
我的 Java webapp 中有一堆 servlet 上下文侦听器,每个侦听器都收集有关环境的一些信息。
其中一些依赖于另一个听众收集的信息。但是我无法确定监听器注册和调用的顺序,所以我不得不复制代码。
我知道听众是按照他们在 web.xml 中的顺序注册的,但这对我来说听起来有点模糊,太模糊以至于无法依赖它。
你有提示我如何解决我的问题吗?
所有 servlet 容器和 Java EE 容器都严格执行规范的这一部分。您可以依赖于侦听器按照您在 web.xml 中指定的顺序调用的事实。
您可以拥有一个应用程序级别的数据结构(HashMap),每个过滤器/侦听器在遇到来自请求的数据时都会对其进行更新。这将让每个 Listener 只更新必要的内容。您可以将公共代码放在基础侦听器中,这样就不会出现代码重复。
为什么这么模糊?web.xml 中的顺序非常明确地表示它们被调用的顺序,Java EE 规范中非常清楚地说明了这一点。完全可以依赖它。
看起来您可以创建一个 ListenerManager,将其放置为您唯一的侦听器,并让它包含其他侦听器。当事件到来时,只需按照您需要的顺序(可能是您在 ListenerManager 的构造函数中创建它们的顺序)调用其他每个 Listener。
不幸的是,这意味着添加侦听器时会更改代码,但是您可以通过巧妙地使用属性文件和 create-from-class-name 代码来避免这种情况。