1.1 第一问:SSM整合需要几个IoC容器?
两个容器
本质上说,整合就是将三层架构和框架核心API组件交给SpringIoC容器管理!
一个容器可能就够了,但是我们常见的操作是创建两个IoC容器(web容器和root容器),组件分类管理!
这种做法有以下好处和目的:
- 分离关注点:通过初始化两个容器,可以将各个层次的关注点进行分离。这种分离使得各个层次的组件能够更好地聚焦于各自的责任和功能。
- 解耦合:各个层次组件分离装配不同的IoC容器,这样可以进行解耦。这种解耦合使得各个模块可以独立操作和测试,提高了代码的可维护性和可测试性。
- 灵活配置:通过使用两个容器,可以为每个容器提供各自的配置,以满足不同层次和组件的特定需求。每个配置文件也更加清晰和灵活。
在SpringBoot中 , 进一步简化为1个容器.
1.2 第二问:两个IoC容器分别对应哪些类型组件?
root是父 , web是子
1.3 第三问:两个IoC容器的注入(调用方向)关系?
- 两个无关容器不可互相注入
- 子容器(web)可向父容器(root)单向注入 . 在实际开发中就是如此 , 我们都是从Controller开始向下注入Service的.
1.4第四问:具体添加多少个配置类以及对应容器关系?
初期为了方便理解 , 三层架构每层对应一个配置类,分别指定两个容器加载即可!
1.5 第五问: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[] { "/" };
}
}