一、概述
ContextLoaderListener(以下简称CLL)是一个在web.xml中定义的监听器,用于在应用启动时加载Spring上下文。当web应用程序启动时,ServletContext监听器会接收到ServletContext初始化事件,该监听器是Servlet环境中的一个标准类,用于在Web应用程序的生命周期中加载Spring ApplicationContext。在Servlet容器启动时,Servlet容器会加载web.xml文件,其中包含注册的ServletContext监听器,此时会自动实例化CLL并运行其contextInitialized()方法。
二、使用
开发人员只需要在web.xml文件中配置CLL即可。在web.xml文件中,CLL应在其他Servlet之前配置。同样,可以配置多个CLL,它们可以加载不同的ApplicationContext文件。例如:
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:/applicationContext.xml</param-value> </context-param>
其中,listener-class为CLL的全限定名,contextConfigLocation参数告诉Spring要去哪里加载Application Context文件。这里演示的例子中,是从classpath路径下加载文件。
三、继承
对于需要自定义ApplicationContext的项目,可以继承CLL并覆写其中的contextInitialized方法。例如:
public class CustomContextLoaderListener extends ContextLoaderListener { protected void customizeContext(ServletContext servletContext, ConfigurableWebApplicationContext applicationContext) { // 执行自定义的操作 } @Override public void contextInitialized(ServletContextEvent event) { super.contextInitialized(event); customizeContext(event.getServletContext(), (ConfigurableWebApplicationContext) event.getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE)); } }
通过继承CLL,可以在ApplicationContext加载之前或之后执行一些自定义的操作。在customizeContext方法中,可以添加或修改ApplicationContext中的Bean。
四、上下文环境
使用CLL可以预加载ApplicationContext,使其在请求到达Servlet或Filter时可用,以避免延迟加载。ApplicationContext预加载也可提高web应用程序的性能。CLL在ServletContext初始化后加载ApplicationContext,并将其设置为ServletContext属性。在使用ApplicationContext时,可以使用ServletContext中的属性获取ApplicationContext。例如:
WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(servletContext); MyBean myBean = wac.getBean(MyBean.class);
在该示例中,WebApplicationContextUtils是Spring提供的一个辅助类,用于获取WebApplicationContext。可以通过WebApplicationContextUtils获取ServletContext中存储的ApplicationContext,并从中获取Bean。
五、优化
使用CLL并不是完美的解决方案。对于大型应用程序,ApplicationContext可以相当复杂,且包含大量Bean。如果所有的Bean都是在应用程序启动时加载,将会消耗大量的内存。为此,应该使用懒加载机制避免在加载Application Context时加载所有Bean。例如:
<bean id="myBean" class="com.example.MyBean" lazy-init="true" />
lazy-init=”true”将Bean设置为懒加载,只有当被引用时才会实例化。在应用程序启动时,只有核心Bean会被加载,而其他Bean将在需要时才会加载。
六、总结
ContextLoaderListener是一个非常有用的类,它使Spring ApplicationContext在web应用程序启动时预加载。通过定制自己的实现,可以扩展CLL的功能。使用懒加载机制可以避免在启动时加载所有Bean,提高了性能。虽然ContextLoaderListener在大多数情况下都是非常有用的,但是需要注意不要滥用它。
原创文章,作者:NPASN,如若转载,请注明出处:https://www.506064.com/n/351591.html