• SSM - Springboot - MyBatis-Plus 全栈体系(二十三)


    第五章 SSM

    • 框架实战:SSM 整合原理和实战

    一、SSM 整合理解

    1. 什么是 SSM 整合?

    • 微观:将学习的 Spring SpringMVC Mybatis 框架应用到项目中!

      • SpringMVC 框架负责控制层
      • Spring 框架负责整体和业务层的声明式事务管理
      • MyBatis 框架负责数据库访问层
    • 宏观:Spring 接管一切(将框架核心组件交给 Spring 进行 IoC 管理),代码更加简洁。

      • SpringMVC 管理表述层、SpringMVC 相关组件
      • Spring 管理业务层、持久层、以及数据库相关(DataSource,MyBatis)的组件
      • 使用 IoC 的方式管理一切所需组件
    • 实施:通过编写配置文件,实现 SpringIoC 容器接管一切组件。

    2. SSM 整合核心问题明确

    2.1 SSM 整合需要几个 IoC 容器?
    • 两个容器
      • 本质上说,整合就是将三层架构和框架核心 API 组件交给 SpringIoC 容器管理!
      • 一个容器可能就够了,但是我们常见的操作是创建两个 IoC 容器(web 容器和 root 容器),组件分类管理!
    • 这种做法有以下好处和目的:
    1. 分离关注点:通过初始化两个容器,可以将各个层次的关注点进行分离。这种分离使得各个层次的组件能够更好地聚焦于各自的责任和功能。
    2. 解耦合:各个层次组件分离装配不同的 IoC 容器,这样可以进行解耦。这种解耦合使得各个模块可以独立操作和测试,提高了代码的可维护性和可测试性。
    3. 灵活配置:通过使用两个容器,可以为每个容器提供各自的配置,以满足不同层次和组件的特定需求。每个配置文件也更加清晰和灵活。
    • 总的来说,初始化两个容器在 SSM 整合中可以实现关注点分离、解耦合、灵活配置等好处。它们各自负责不同的层次和功能,并通过合适的集成方式协同工作,提供一个高效、可维护和可扩展的应用程序架构!
    2.2 每个 IoC 容器对应哪些类型组件?
    2.2.1 图解

    在这里插入图片描述

    2.2.2 总结:
    容器名盛放组件
    web 容器web 相关组件(controller,springmvc 核心组件)
    root 容器业务和持久层相关组件(service,aop,tx,dataSource,mybatis,mapper 等)
    2.3 IoC 容器之间关系和调用方向?
    2.3.1 情况一:两个无关联 IoC 容器之间的组件无法注入!

    在这里插入图片描述

    2.3.2 情况二:子 IoC 容器可以单向的注入父 IoC 容器的组件!

    在这里插入图片描述

    2.3.3 结论:web 容器是 root 容器的子容器,父子容器关系。
    • 父容器:root 容器,盛放 service、mapper、mybatis 等相关组件
    • 子容器:web 容器,盛放 controller、web 相关组件
    2.3.4 源码体现
    • FrameworkServlet 655 行!
    protected WebApplicationContext createWebApplicationContext(@Nullable ApplicationContext parent) {
        Class<?> contextClass = getContextClass();
        if (!ConfigurableWebApplicationContext.class.isAssignableFrom(contextClass)) {
          throw new ApplicationContextException(
              "Fatal initialization error in servlet with name '" + getServletName() +
              "': custom WebApplicationContext class [" + contextClass.getName() +
              "] is not of type ConfigurableWebApplicationContext");
        }
        ConfigurableWebApplicationContext wac =
            (ConfigurableWebApplicationContext) BeanUtils.instantiateClass(contextClass);
    
        wac.setEnvironment(getEnvironment());
        //wac 就是web ioc容器
        //parent 就是root ioc容器
        //web容器设置root容器为父容器,所以web容器可以引用root容器
        wac.setParent(parent);
        String configLocation = getContextConfigLocation();
        if (configLocation != null) {
          wac.setConfigLocation(configLocation);
        }
        configureAndRefreshWebApplicationContext(wac);
    
        return wac;
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    2.3.5 调用流程图解

    在这里插入图片描述

    2.4 具体多少配置类以及对应容器关系?
    • 配置类的数量不是固定的,但是至少要两个,为了方便编写,我们可以三层架构每层对应一个配置类,分别指定两个容器加载即可!
      在这里插入图片描述
    • 建议配置文件:
    配置名对应内容对应容器
    WebJavaConfigcontroller,springmvc 相关web 容器
    ServiceJavaConfigservice,aop,tx 相关root 容器
    MapperJavaConfigmapper,datasource,mybatis 相关root 容器
    2.5 IoC 初始化方式和配置位置?
    • 在 web 项目下,我们可以选择 web.xml 和配置类方式进行 ioc 配置,推荐配置类。
    • 对于使用基于 web 的 Spring 配置的应用程序,建议这样做,如以下示例所示:
    public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    
      //指定root容器对应的配置类
      //root容器的配置类
      @Override
      protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] { ServiceJavaConfig.class,MapperJavaConfig.class };
      }
    
      //指定web容器对应的配置类 webioc容器的配置类
      @Override
      protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] { WebJavaConfig.class };
      }
    
      //指定dispatcherServlet处理路径,通常为 /
      @Override
      protected String[] getServletMappings() {
        return new String[] { "/" };
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 图解配置类和容器配置:
      在这里插入图片描述
  • 相关阅读:
    不同的字符串之间的转换
    【单片机】【数码管】数码管显示
    线性表的两个非递减集合求并集
    枚举(enum)/共用体(union)/结构体(struct)---详解
    SpringBoot之@ConfigurationProperties和@Value用法详解
    git多平台多账号公钥配置
    单例模式、工厂模式 c++关键字 static
    常见的查找算法以及分块搜索算法的简明教程
    Symbol基本数据类型
    SQL语句
  • 原文地址:https://blog.csdn.net/sgsgkxkx/article/details/133714738