Web环境下几种容器与SpringIOC容器

简介: Web环境下几种容器与SpringIOC容器

IOC容器的获取主要思想是通过配置监听器,在项目启动时,查找类路径下的applicationContext.xml文件,创建容器。或者如果项目使用全注解,则使用配置类创建容器。

项目中的容器包含关系 :

ServletContext(Tomcat创建) >
Root WebApplicationContext(IOC Web根容器)>
Servlet WebApplicationContext(SpringMVC 子容器)

如下所示在注册contextLoaderListener时会创建RootAppContext:

【1】自定义监听器获取IOC容器

实现ServletContextListener

如下是获取ClassPathXmlApplicationContext容器,这需要有applicationContext.xml文件。

public class SpringServletContextListener implements ServletContextListener {
  public void contextDestroyed(ServletContextEvent sce) {
    System.out.println("容器销毁********");
  }
  public void contextInitialized(ServletContextEvent sce) {
    ServletContext servletContext = sce.getServletContext();
    //获取配置文件名称
    String configLocation = servletContext.getInitParameter("configLocation");
    //创建IOC容器
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext(configLocation);
    //放入servletContext中
    servletContext.setAttribute("applicationContext", applicationContext);
    if (applicationContext != null) {
      System.out.println("IOC 容器初始化成功");
    }
  }
}

web.xml

<context-param>
    <param-name>configLocation</param-name>
    <param-value>applicationContext.xml</param-value>
</context-param>
  <!-- ******启动IOC容器的ServletContextListener****** -->
  <listener>
    <display-name>SpringServletContextListener</display-name>
    <listener-class>
      com.web.listener.SpringServletContextListener
    </listener-class>
  </listener>

【2】Spring自带监听器进行IOC容器初始化

Spring提供了org.springframework.web.context.ContextLoaderListener在项目启动时,自动初始化容器。同样,需要在web.xml里面配置applicationContext.xml路径;

 <!-- ****Spring IOC 容器初始化**** -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
  </context-param>
  <listener>
    <listener-class>
      org.springframework.web.context.ContextLoaderListener
    </listener-class>
  </listener>

【2】Spring自带监听器进行IOC容器初始化

Spring提供了org.springframework.web.context.ContextLoaderListener在项目启动时,自动初始化容器。同样,需要在web.xml里面配置applicationContext.xml路径;

 <!-- ****Spring IOC 容器初始化**** -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
  </context-param>
  <listener>
    <listener-class>
      org.springframework.web.context.ContextLoaderListener
    </listener-class>
  </listener>

【3】获取IOC容器的两种方式

public void contextInitialized(ServletContextEvent sce) {
  ServletContext servletContext = sce.getServletContext();
/*第一种取得applicationContext的方式,根据属性名获取*/
  ApplicationContext applicationContext = (ApplicationContext) servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
  /*查看源码
  ContextLoader.class的public WebApplicationContext initWebApplicationContext(ServletContext servletContext) {
  servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);
  }可知,在创建applicationContext时,将其根据属性名放入了servletContext中
  */
  /*第二种取得applicationContext的方式,使用Spring提供的工具类,传入应用上下文对象,就可以获取IOC容器*/
  applicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext);
  /*如果在jsp页面获取,则传入application隐式对象*/
}

【3】IOC工具类

package com.corn.core.spring;
import java.util.Enumeration;
import javax.servlet.ServletContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springframework.web.servlet.FrameworkServlet;
import com.corn.core.utils.ToolUtils;
public class SpringIocUtil {
  private final static  Logger log = LoggerFactory.getLogger(SpringIocUtil.class);
  public  final static  String fail_info = "get %s  fail,ServletContext  not loading.";
  public  final static  String springConfigFilePath = "applicationContext.xml";
  public  final static  String success_info = "get %s   success:";
  public static synchronized <T> T getBean(Class<T> beanName) {
    return getInstence(beanName, getContext());
  }
  public static synchronized <T> T getBean(Class<T> beanName,ApplicationContext context) {
    return getInstence(beanName, context);
  }
  public static synchronized <T> T getBean(Class<T> beanName,ServletContext servletcontext) {
    return getInstence(beanName, WebApplicationContextUtils.getRequiredWebApplicationContext(servletcontext));
  }
  public static synchronized Object getBean(String beanName) {
    return getInstence(beanName, getContext());
  }
  public static synchronized Object getBean(String beanName,ApplicationContext context) {
    return getInstence(beanName, context);
  }
  public static synchronized Object getBean(String beanName,ServletContext servletcontext) {
    return getInstence(beanName, WebApplicationContextUtils.getRequiredWebApplicationContext(servletcontext));
  }
  private static  <T> T getInstence(Class<T> beanName,ApplicationContext context) {
    try {
      if (context == null) {
        log.error(String.format(fail_info, beanName));
        return null;
      }
      T t = context.getBean(beanName);
      if (t != null) {
        log.debug(String.format(success_info, beanName) + t);
        return t;
      }
    } catch (Exception e) {
      log.error(SpringIocUtil.class.getName()+" T getInstence(beanName,context) ",e);
    }
    return null;
  }
  private static  Object getInstence(String beanName,ApplicationContext context) {
    try {
      if (context == null) {
        log.error(String.format(fail_info, beanName));
        return null;
      }
      Object t = context.getBean(beanName);
      if (t != null) {
        log.debug(String.format(success_info, beanName) + t);
        return t;
      }
    } catch (Exception e) {
      log.error(SpringIocUtil.class.getName()+" Object getInstence(beanName,context)",e);
    }
    return null;
  }
  public static ApplicationContext getContext() {
    ApplicationContext context = null;
    try{
      Enumeration<String> ns= SpringIocContextListener.getServletcontext().getAttributeNames();
      while(ns.hasMoreElements()){
        String name=ns.nextElement();
        log.debug(name+" IS SERVLET_CONTEXT_PREFIX:",name.matches(FrameworkServlet.SERVLET_CONTEXT_PREFIX+"*"));
      }
      context = WebApplicationContextUtils.getWebApplicationContext(SpringIocContextListener.getServletcontext());
    }catch(Exception e){
      log.warn("Spring IOC getWebApplicationContext(sc) type fail.");
    }
    String name=null;
    if (context == null) {
      try{
        name=FrameworkServlet.SERVLET_CONTEXT_PREFIX+"Spring-MVC";
        context=WebApplicationContextUtils.getWebApplicationContext(SpringIocContextListener.getServletcontext(), name);
      }catch(Exception e){
        log.warn("Spring IOC getWebApplicationContext(sc,\""+name+"\") type fail[default].");
      }
    }
    if (context == null) {
      try{
        Enumeration<String> ns_= SpringIocContextListener.getServletcontext().getAttributeNames();
        while(ns_.hasMoreElements()){
           name=ns_.nextElement();//从spring 配置中获取上下面名称
          if(null!=name&&name.trim().length()>0&&name.matches(FrameworkServlet.SERVLET_CONTEXT_PREFIX+"*")){
            context=WebApplicationContextUtils.getWebApplicationContext(SpringIocContextListener.getServletcontext(), name);
            break;
          }
        }
      }catch(Exception e){
        log.warn("Spring IOC getWebApplicationContext(sc,\""+name+"\") type fail.");
      }
    }
    if (context == null) {
      try{
        context=WebApplicationContextUtils.getRequiredWebApplicationContext(SpringIocContextListener.getServletcontext());
      }catch(Exception e){
        log.warn("Spring IOC getRequiredWebApplicationContext type fail.");
      }
    }
    if (context == null) {
      try{
          context = initLocalAppContext();
      }catch(Exception e){
        e.printStackTrace();
        log.warn("Spring IOC ClassPathXmlApplicationContext type fail.");
      }
    }
    return context;
  }
  private static ApplicationContext initLocalAppContext() {
    if(ToolUtils.isEmpty(springConfigFilePath)){
      log.error("Spring Config FilePath is empty.");
      return null;
    }
    ApplicationContext context = new ClassPathXmlApplicationContext(springConfigFilePath);
    log.info("load " + springConfigFilePath + " success!");
    return context;
  }
}


目录
相关文章
|
3月前
|
前端开发 API Docker
web前端开发项目走proxy代理后端接口,构建发布到生产等环境后,如何修改api接口
web前端开发项目走proxy代理后端接口,构建发布到生产等环境后,如何修改api接口
42 0
|
30天前
|
运维 Kubernetes 监控
构建高效稳定的容器化运维环境
在现代IT基础设施中,容器技术以其轻量级、快速部署和易于管理的特性成为企业数字化转型的重要支撑。本文将深入探讨如何构建一个高效且稳定的容器化运维环境,涵盖从容器选择、集群管理到持续集成与持续部署(CI/CD)的最佳实践。文章旨在为运维工程师提供一套系统的解决方案,以应对日益复杂的业务需求和技术挑战。
|
1月前
|
资源调度 JavaScript Shell
6.6k star!推荐一款轻松创建隔离环境的命令行及容器工具!
6.6k star!推荐一款轻松创建隔离环境的命令行及容器工具!
|
1月前
|
测试技术 Go 云计算
Go语言优化云计算与容器化环境的策略与最佳实践
【2月更文挑战第15天】在云计算和容器化环境中,Go语言的应用和优化策略对于提高系统的性能和效率至关重要。本文深入探讨了如何使用Go语言优化云计算和容器化环境,包括内存管理、并发编程、代码优化等方面的最佳实践,旨在帮助开发者充分利用Go语言的优势,提升系统的整体性能。
|
1月前
|
Kubernetes Go 开发者
Go语言在容器化环境中的实践
【2月更文挑战第15天】随着容器技术的兴起,Go语言在容器化环境中的实践逐渐受到关注。本文探讨了Go语言如何与容器技术相结合,发挥其在容器化环境中的优势,包括轻量级部署、高并发处理、快速构建和部署等方面的特点,并通过实例展示了Go语言在容器化环境中的实践应用。
|
2月前
|
虚拟化 开发者 Docker
深入浅出:利用Docker容器化技术加速Web开发流程
在本篇文章中,我们将探讨Docker容器化技术如何为Web开发带来革命性的效率提升。通过具体案例和实操示范,我们不仅会介绍Docker的基本概念和工作原理,还将深入分析如何利用Docker容器化技术简化开发环境的搭建、提高应用的可移植性以及加快部署速度。本文旨在为读者提供一种全新的视角,理解并实践如何通过Docker优化现代Web开发流程,无论是对于个人开发者还是团队项目,都将带来前所未有的便捷和效率。
31 0
|
2月前
|
负载均衡 开发者 Docker
深入浅出:利用Docker容器化技术提升Web开发效率
在快速变化的软件开发领域,开发者面临着环境一致性和项目部署效率的双重挑战。Docker作为一种先进的容器化技术,为解决这些问题提供了优雅的解决方案。本文将探讨Docker的核心概念、优势以及如何在Web开发中应用Docker来提升开发和部署的效率。通过实际案例分析,读者将了解到如何构建、分享和运行Docker容器,以确保开发环境的一致性,并加速Web应用的交付过程。
|
2月前
|
算法 计算机视觉 Docker
Docker容器中的OpenCV:轻松构建可移植的计算机视觉环境
Docker容器中的OpenCV:轻松构建可移植的计算机视觉环境
|
2月前
|
存储
Spring5源码(52)-Web应用上下文环境创建
Spring5源码(52)-Web应用上下文环境创建
24 0
|
3月前
|
存储 安全 Java
从HTTP到Tomcat:揭秘Web应用的底层协议与高性能容器
从HTTP到Tomcat:揭秘Web应用的底层协议与高性能容器