在学习Spring mvc时,在用ApplicationContext创建Spring 容器时不是有两种方法吗,一种是利用注解核心配置类,也就是
AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(SpringConfiguration.class);
还有一种是用ApplicationContext.xml配置,
但是之后想用Spring的ContextLoaderListener创建上下文对象,并存储到域中。视频中教的是用xml文件配置,可是我用的是注解核心配置类,那该怎么写呢,下面是web.xml的代码
如果想在注解核心配置类中使用Spring的ContextLoaderListener创建上下文对象,并存储到域中,可以通过添加@WebListener注解和实现ServletContextListener接口的方式实现。
具体步骤如下:
1.在SpringConfiguration类上添加@WebListener注解,标记该类为监听器。
2.实现ServletContextListener接口,实现contextInitialized()方法和contextDestroyed()方法。
3.在contextInitialized()方法中,使用AnnotationConfigWebApplicationContext创建Spring容器,并将其存储到ServletContext域中。
4.在contextDestroyed()方法中,销毁Spring容器。
示例代码如下:
@WebListener
public class SpringContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
// 创建Spring容器
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.register(SpringConfiguration.class);
context.refresh();
// 将Spring容器存储到ServletContext域中
sce.getServletContext().setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, context);
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
// 销毁Spring容器
AnnotationConfigWebApplicationContext context =
(AnnotationConfigWebApplicationContext) sce.getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
context.close();
}
}
@Configuration
@ComponentScan("com.cyf")
@Import({DataSourceConfiguration.class})
public class SpringConfiguration {
// ...
}
在web.xml中,仍然需要配置ContextLoaderListener监听器:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:com/cyf/config/SpringConfiguration.java</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
这样,在使用AnnotationConfigApplicationContext创建Spring容器时,也可以通过ContextLoaderListener创建上下文对象,并存储到域中。
有相关的接口,实现接口的方法
public class ContextLoaderListener extends ContextLoader implements ServletContextListener
所以将执行ContextLoaderListener类中的contextInitialized方法
@Override
public void contextInitialized(ServletContextEvent event) {
initWebApplicationContext(event.getServletContext());
}