context容器上下文件

在web项目中想要获取哪个bean,得先得到容器上下文context

 1 public class MyLoaderListener extends ContextLoader implements ServletContextListener {
 2     private static final Logger logger = LoggerFactory.getLogger(MyLoaderListener.class);
 3 
 4     @Override
 5     public void contextInitialized(ServletContextEvent servletContextEvent) { 
7
ApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContextEvent.getServletContext()); 8 MyBeanFactory.setContext(context); 15 } 16 17 @Override 18 public void contextDestroyed(ServletContextEvent servletContextEvent) { 20 } 21 }
ContextLoader 类能获取WebApplicationContext
ServletContextListener 接口的
public void contextInitialized(ServletContextEvent servletContextEvent) 方法初始化
public void contextDestroyed(ServletContextEvent servletContextEvent) 方法销毁

MyLoaderListener 类将ApplicationContext 塞比例MyBeanFactory类
 1 public final class MyBeanFactory {
 2 
 3     private static ApplicationContext context;
 4 
 5     public static void setContext(ApplicationContext context) {
 6         MyBeanFactory.context = context;
 7     }
 8 
 9     public static Object getBean(String beanName) {
10         return context.getBean(beanName);
11     }
12 }
MyBeanFactory 类的静态方法,可以随时获取任务bean


 ServletContext 被 Servlet 程序用来与 Web 容器通信。每一个 Web 应用程序含有一个Context ,被Web 应用内的各个程序共享。

因为Context 可以用来保存资源并且共享,所以我所知道的ServletContext 的最大应用是Web 缓存---- 把不经常更改的内容读入内存,所以服务器响应请求的时候就不需要进行慢速的磁盘I/O 了。

   ServletContextListener 是 ServletContext 的监听者,如果 ServletContext 发生变化,如服务器启动时ServletContext 被创建,服务器关闭时 ServletContext 将要被销毁。

       在JSP 文件中,application 是 ServletContext 的实例,由JSP 容器默认创建。Servlet 中调用getServletContext() 方法得到 ServletContext 的实例。

我们使用缓存的方法:

       1. 服务器启动时,ServletContextListener 的 contextInitialized() 方法被调用,所以在里面创建好缓存。可以从文件中或者从数据库中读取取缓存内容生成类,用 servletContext.setAttribute() 方法将缓存类保存在ServletContext 的实例中。

       2. 程序使用 ServletContext.getAttribute() 读取缓存。如果是 JSP ,使用application.getAttribute() 。如果是Servlet ,使用 getServletContext().getAttribute() 。如果缓存发生变化( 如访问计数) ,你可以同时更改缓存和文件/ 数据库。或者你等变化积累到一定程序再保存,也可以在下一步保存。

       3. 服务器将要关闭时,ServletContextListener 的 contextDestroyed() 方法被调用,所以在里面保存缓存的更改。将更改后的缓存保存回文件或者数据库,更新原来的内容。