Jakarta ee ServletContextAttributeListener的AttributeReaded方法在同一web应用程序中也有ServletContextListener时执行两次

Jakarta ee ServletContextAttributeListener的AttributeReaded方法在同一web应用程序中也有ServletContextListener时执行两次,jakarta-ee,deployment-descriptor,servletcontextlistener,Jakarta Ee,Deployment Descriptor,Servletcontextlistener,我面临着一个关于ServletContextAttributeListener的问题 我有一个小型java EE web应用程序,我在其中创建了一个ServletContextAttribute: public class MyServletContextAttributeListener implements ServletContextAttributeListener{ public void attributeAdded(ServletContextAttrib

我面临着一个关于
ServletContextAttributeListener
的问题

我有一个小型java EE web应用程序,我在其中创建了一个
ServletContextAttribute

    public class MyServletContextAttributeListener implements ServletContextAttributeListener{

        public void attributeAdded(ServletContextAttributeEvent event){
               System.out.println("Connection attribute added to ServletContext");
        }

        public void attributeRemoved(ServletContextAttributeEvent event){
        }

        public void attributeReplaced(ServletContextAttributeEvent event){
        }

}
我在部署描述符中声明了我的侦听器,如下所示:

<listener>
    <listener-class>com.example.listener.MyServletContextAttributeListener</listener-class>
</listener>
我还在部署描述符中声明了
ServletContextListener

问题是,当我在
apachetomcat
中启动我的应用程序时,
attributeaded
方法会执行两次。当我删除ServletContextListener时,
attributeAdded
方法运行一次

有人能解释一下为什么吗?
如何在部署描述符中同时声明ServletContextListener和ServletContextAttributeListener而不出现这种奇怪的行为?

您看到哪个
属性被添加到
ServletContext
了吗?打印要调用
attributeaded
属性的名称。使用
ServletContextAttributeEvent#getName()
打印属性的名称。我认为连接不会被添加两次。其他内容可能正在向上下文中添加其他内容。好的!你说得对。我按照你的建议做了,两个不同的属性被添加到了
ServletContext
:我明确定义的
databaseConnection
属性,以及另一个名为
org.apache.jasper.compiler.tldlocationcache
。我阅读了javadoc,它是一个容器,用于在web应用程序中全局访问标记库。由于我在应用程序中不使用JSP,所以将tomcat配置为不自动添加此属性是否安全?如果是,是否有一种方法不是通过编程而是通过使用tomcat配置文件来实现?
    public class DatabaseInitializer implements ServletContextListener{

        public void contextInitialized(ServletContextEvent event){
        ...            
        event.getServletContext().setAttribute("databaseConnection", connection);
        ...
    }
}