赞
踩
微观:将学习的 Spring
SpringMVC
Mybatis
框架应用到项目中!
SpringMVC
框架负责控制层Spring
框架负责整体和业务层的声明式事务管理MyBatis
框架负责数据库访问层宏观:Spring
接管一切(将框架核心组件交给 Spring
进行 IoC
管理),代码更加简洁。
SpringMVC
管理表述层、SpringMVC
相关组件Spring
管理业务层、持久层、以及数据库相关(DataSource,MyBatis)的组件IoC
的方式管理一切所需组件实施:通过编写配置文件,实现SpringIoC
容器接管一切组件。
两个容器
本质上说,整合就是将三层架构和框架核心API
组件交给SpringIoC
容器管理!
一个容器可能就够了,但是我们常见的操作是创建两个IoC
容器(web
容器和root
容器),组件分类管理!
这种做法有以下好处和目的:
总的来说,初始化两个容器在SSM
整合中可以实现关注点分离、解耦合、灵活配置等好处。它们各自负责不同的层次和功能,并通过合适的集成方式协同工作,提供一个高效、可维护和可扩展的应用程序架构!
图解:
总结:
容器名 | 盛放组件 |
---|---|
web 容器 | web 相关组件(controller ,springmvc 核心组件) |
root 容器 | 业务和持久层相关组件(service ,aop ,tx ,dataSource ,mybatis ,mapper 等) |
情况1:两个无关联
IoC
容器之间的组件无法注入!
情况2:子
IoC
容器可以单向的注入父IoC
容器的组件!
结论:**web**
容器是**root**
**容器的子容器,父子容器关系。 **
root
容器,盛放service
、mapper
、mybatis
等相关组件web
容器,盛放controller
、web
相关组件源码体现: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; }
调用流程图解:
配置类的数量不是固定的,但是至少要两个,为了方便编写,可以三层架构每层对应一个配置类,分别指定两个容器加载即可!
建议配置文件:
配置名 | 对应内容 | 对应容器 |
---|---|---|
WebJavaConfig | controller ,springmvc 相关 | web 容器 |
ServiceJavaConfig | service ,aop ,tx 相关 | root 容器 |
MapperJavaConfig | mapper ,datasource ,mybatis 相关 | root 容器 |
在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[] { "/" }; } }
图解配置类和容器配置:
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。