一、SSM整合

一、SSM整合

1、什么是SSM整合?

1、微观角度

1、将学习的Spring SpringMVC Mybatis框架应用到项目中!

2、SpringMVC框架负责控制层

3、Spring 框架负责整体和业务层的声明式事务管理

4、MyBatis框架负责数据库访问层

2、宏观角度

1、Spring接管一切(将框架核心组件交给Spring进行IoC管理),代码更加简洁。

2、SpringMVC管理表述层、SpringMVC相关组件

3、Spring管理业务层、持久层、以及数据库相关(DataSource,MyBatis)的组件

4、使用IoC的方式管理一切所需组件

3、实施

1、通过编写配置文件,实现SpringIoC容器接管一切组件。

2、SSM整合核心问题明确

1、第1问:SSM整合需要几个IoC容器

1、答案

1、答案:两个容器

2、本质:整合就是将三层架构和框架核心API组件交给SpringIoC容器管理!

3、1个容器可能就够了,但是常规操作是2个容器

2、目的和好处

1、分离关注点

  • 通过初始化两个容器,可以将各个层次的关注点进行分离。
  • 这种分离使得各个层次的组件能够更好地聚焦于各自的责任和功能。

2、解耦合

  • 各个层次组件分离装配不同的IoC容器,这样可以进行解耦。
  • 这种解耦合使得各个模块可以独立操作和测试,提高了代码的可维护性和可测试性。

3、灵活配置

  • 通过使用两个容器,可以为每个容器提供各自的配置,
  • 以满足不同层次和组件的特定需求。
  • 每个配置文件也更加清晰和灵活。

4、总结

  • 总的来说,初始化两个容器在SSM整合中可以实现关注点分离、解耦合、灵活配置等好处。它们各自负责不同的层次和功能,并通过合适的集成方式协同工作,提供一个高效、可维护和可扩展的应用程序架构!

2、第2问:每个Ioc容器对应哪些类型的组件

1、图例

image-20240117200630611

2、总结

容器名 盛放组件
web容器 web相关组件(controller,springmvc核心组件)
root容器 业务和持久层相关组件(service,aop,tx,dataSource,mybatis,mapper等)

3、第3问:IoC容器之间的关系和调用方向?

1、情况

1、情况1

  • 两个没有关联的Ioc容器,组件无法注入
  • 图解
  • image-20240117200845939

2、情况2

  • 子IoC容器可以单向的注入父IoC容器的组件!
  • 图解
  • image-20240117200915747

2、总结

1、web容器是root容器的子容器,父子容器关系。

2、父容器:root容器,盛放service、mapper、mybatis等相关组件

3、子容器:web容器,盛放controller、web相关组件

4、查看原码

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;
  }

3、调用流程图解

image-20240117201025671

4、第4问:具体多少配置类以及对应容器关系?

1、答案

1、配置类的数量不固定,因人而异。但是至少2个

2、为了方便,我们一般三层架构对应3个配置类

3、图解

  • image-20240117201149618

4、建议配置文件如下

配置名 对应内容 对应容器
WebJavaConfig controller,springmvc相关 web容器
ServiceJavaConfig service,aop,tx相关 root容器
MapperJavaConfig mapper,datasource,mybatis相关 root容器

5、第5问:IoC初始化方法和配置位置?

1、在web项目下,我们可以选择web.xml和配置类方式进行ioc配置,推荐配置类。

2、对于使用基于 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[] { "/" };
  }
}

3、图解配置类和容器的配置

image-20240117201343890

6、总结

1、一般要有2个IoC容器

2、一个IoC容器装web,一个IoC容器装root

3、配置类和三层架构一样,写3个配置类,对应controller、service、mapper

4、web的IoC容器是子容器,root的IoC容器是父容器。这样才可以组件键相互使用

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇