首页 > 其他分享 >13.0 SpringMVC父子容器

13.0 SpringMVC父子容器

时间:2022-10-17 20:58:25浏览次数:80  
标签:xml 容器 SPI SpringMVC 接口 实现 13.0

一、 Spring整合SpringMVC

Spring整合SpringMVC唯一的体现就是父子容器:、

  • 通常我们会设置父容器(Spring)管理Service、Dao层的Bean, 子容器 (SpringMVC)管理Controller的Bean
  • 子容器可以访问父容器的Bean, 父容器无法访问子容器的Bean

实现

在整合SSM时web.xml配置过这段

<!‐‐spring 基于web应用的启动‐‐>
<listener>
	<listener‐class>org.springframework.web.context.ContextLoaderListener</listener‐class>
</listener>
<!‐‐全局参数:spring配置文件‐‐>
<context‐param>
    <param‐name>contextConfigLocation</param‐name>
    <param‐value>classpath:spring‐core.xml</param‐value>
</context‐param>
<!‐‐前端调度器servlet‐‐>
<servlet>
    <servlet‐name>dispatcherServlet</servlet‐name>
    <servlet‐class>org.springframework.web.servlet.DispatcherServlet</servlet‐class>
	<!‐‐设置配置文件的路径‐‐>
    <init‐param>
        <param‐name>contextConfigLocation</param‐name>
        <param‐value>classpath:spring‐mvc.xml</param‐value>
    </init‐param>
    <!‐‐设置启动即加载‐‐>
    <load‐on‐startup>1</load‐on‐startup>
</servlet>
<servlet‐mapping>
    <servlet‐name>dispatcherServlet</servlet‐name>
    <url‐pattern>/</url‐pattern>
</servlet‐mapping>

配置了DispatcherServlet前端控制器和ContextLoaderListener上下文加载监听器

二、 零配置SpringMVC实现

省略web.xml的方式

1. 注解方式

  • @WebServlet
  • @WebFilter
  • @WebListener

这种方式不利于扩展,如果编写在jar包中toamcat是无法感知的

2. SPI的方式

服务接口扩展,更加易于扩展可用于共享库可插拔的一种方式

服务提供商提供要求的一个接口, 在固定的目录 (META-INF/)放上以接口全类名为命名的文件, 文件中放入接口的实现的全类名,该类由我们自己实现,按照这种约定的方式(即SPI规范),服务提供商会 调用文件中实现类的方法, 从而完成扩展。

  1. 在固定的目录放上接口的文件名 (META-INF/javax.servlet.ServletContainerInitializer)

  2. 文件中放入实现类(该实现类由你实现): 一行一个实现类。

    com.ppku.javaweb.spi.CustomServletContainerInitializer
    
  3. 通过java.util.ServiceLoader提供的ServiceLoader就可以完成SPI的实现类加载

    // 示例
    public class App {
        public static void main(String[] args) {
            ServiceLoader<IUserDao> daos = ServiceLoader.load(IUserDao.class);
            for (IUserDao dao : daos) {
            	dao.save();
            }
       }
    }
    
    public class TulingSpringServletContainerInitializer extends SpringServletContainerInitializer {
    
        @Override
        public void onStartup(Set<Class<?>> webAppInitializerClasses, ServletContext
        servletContext) throws ServletException {
             // 通过servletContext动态添加Servlet
             servletContext.addServlet("spiServlet", new HttpServlet() {
                 @Override
                 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                    resp.getWriter().write("spiServlet‐‐doGet");
                }
             }).addMapping("/spiServlet.do");
    	}
    }
    
    

三、实现基于SPI规范的SpringMVC

在SpringMVC中, 上面的接口文件和实现类都把我们实现好了,甚至 ContextLoaderListener和DispatcherServlet都帮我们注册好了,我们只要让他生效

四、SPI方式SpringMVC启动原理

1.流程图

2.源码流程

3.创建父容器

4.创建子容器

五、. 初始化ContextLoaderListener

六、初始化DispatcherServlet

七、总结

标签:xml,容器,SPI,SpringMVC,接口,实现,13.0
From: https://www.cnblogs.com/ppku/p/16800617.html

相关文章

  • SpringMVC(五):重定向和请求转发
    我们都知道通过servlet跳转到具体的视图有两种方式,一种方式是重定向,一种方式请求转发。那么在SpringMVC中视图解析后跳转是哪种方式实现的呢?很明显在我们发起请求时地址栏......
  • 采用Ingress暴露容器化应用(Nginx)
    1.部署容器化应用[root@k8smaster~]#kubectlcreatedeploymentnginx--image=nginxdeployment.apps/nginxcreated2.暴露该服务[root@k8smaster~]#kubectlexpose......
  • SpringMVC(四):RequestMapping
    现在我们来学习一下RequestMapping注解。RequestMapping注解用来将url映射到一个控制类(Controller类)或一个特定处理的方法上。一、RequestMapping使用的位置1.方法上直......
  • Docker 容器使用
      Docker客户端使用Linux最好还是整个服务器,买太贵了,建议租一个,我用的是3A服务器,大家一起来学习吧!docker 客户端非常简单 ,我们可以直接输入 docker 命令来......
  • Docker容器简介及命令
    使用Linux最好还是整个服务器,买太贵了,建议租一个,我用的是3A服务器docker简述Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像......
  • SpringMVC(一):SpringMVC的执行流程
    先看一张图:从这张图我们可以很直观地看出来,SpringMVC的执行流程大致分为以下几步:1.用户发起的请求被前端控制器DispatcherServlet接收;2.DispatcherServlet调用处理映射......
  • Docker容器底层技术
    前戏为了更好地理解容器的特性,可以刨析容器的底层实现技术。​​cgroup​​​和​​namespace​​是最重要的两种技术。cgroup实现资源限额,namespace实现资源隔离。 cgroup......
  • 配置容器应用Secret
    Secret资源的功能类似于ConfigMap,但它专用于存放敏感数据,例如密码、数字证书、私钥、令牌和SSHkey等,而不需要把这些敏感数据暴露到镜像或者PodSpec中。Secret可以以V......
  • springMVC的使用
    springMVC的使用2.1新建一个maven项目2.2导入jar包<!--Spring--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId......
  • c++ container容器(string,vector,map,queue,stack等等)
    STL和c++标准库标准模板库STL部分包含在C++标准库中的软件库。c++标准库:即以std::开头,但是部分编译器厂商也会把STL的内容放在std::namespace里面由于​​一个常见的误解​......