梳理SSM整合时,框架之间的关系

91 阅读3分钟

逻辑顺序: Tomcat(JavaWeb容器)--- 监听器创建Spring的IOC容器 --- 前端控制器 --- SpringMVC的IOC容器

首先Tomcat层面,工程为war包,部署时读取web.xml,这是最外层。

Spring的文件位置,作为contextConfigLocation参数放入web.xml中,并在web.xml中配置了一个Web层面的监听器ContextLoaderListener,它实现了ServletContextListener接口,该监听器服务器启动并创建Servlet上下文的时候调用,因此它要比作为Servlet的前端控制器更快被响应,从而通过web.xml的参数找到核心配置文件的位置,先一步创建Spring的IOC容器。根据参数名,可以知道到时候在前端控制器内初始化SpringMVC容器获取他的父容器root然后setParent时用的就是这个。

前端控制器配置在web.xml内,它是一个Servlet,只不过响应了“/”的所有请求(除jsp外),因此它属于JavaWeb的内容,由它统一调配请求给@Controller组件进行响应。需要注意的时,在这整一个响应过程中一直没有离开前端控制器,因为分配的和调用具体的组件处理方法都在DispatcherServlet前端控制器的doDispath。这个方法体内(包括寻找处理器、寻找处理器适配器、调用拦截器pre、调用处理器适配器、调用拦截器post、执行视图跳转和渲染processDispatchResult、调用拦截器AfterCompletion),因此SpringMVC的IOC容器是归于它管理的。

SpringMVC的文件位置、IOC容器创建时间作为参数放入前端控制器中,因此它的容器归DispatcherServlet管理。由前端处理器来统一调配收到的请求,并通过@RequestMapping注解映射到具体的处理方法。由于整个处理过程都在前端控制器内,因此前端控制器的内容包括 寻找寻找处理器、寻找处理器适配器、调用拦截器pre、调用处理器适配器、调用拦截器post、执行视图跳转和渲染processDispatchResult、调用拦截器AfterCompletion

具体分工:

我们知道,前端控制器doDispatch()方法里面里面要获取SpringMVC的IOC,并设置其parent为Spring的IOC。因此Spring的容器是SpringMVC容器的父容器,先有Spring开启了注解驱动扫描属于它的组件,之后SpringMVC开启注解扫描驱动扫描属于它的组件。

Spring容器负责管理@Bean、@Component、派生三个@Controller、@Service、@Repository。@AutoWired、@Qualifier。Aop动态代理的:切面类@Aspect、各种通知@Before、@AfterReturning、@AfterThrowing、@After、@Around。切入点表达式@Pointcut。声明式事务的@Transactional。

SpringMVC容器负责管理 @Controller组件(从Spring中获取+扫描),除外注解:@RequestMapping、@PathVariable、@RequestParam、@RequestHeader、@CookieValue、@GetMapping、@PostMapping、@PutMapping、@DeleteMapping、@RequestBody、@ResponseBody、@RestController、文件下载ResponseEntity<Byte []>返回值、文件上传MultipartFile类型参数、拦截器、异常处理器@ExceptionHandler、@ControllerAdvice。

因此作为底层的@Repository的DAO层的Mybatis,自然而然的被Spring所整合。记录4要素的外部文件交给Spring,由他配置JDBC的Druid作为数据源,并配置使用该数据源的SqlSessionFactoryBean作为bean,它当然需要用到Mybatis的核心配置文件mybatis-config.xml,因此也应该把该核心配置文件的位置交给Spring。该bean是一个SqlSessionFactory(二级缓存),再由它创建SqlSession(一级缓存),之后用SqlSession的getMapper方法可以创建相应的Mapper接口的动态代理对象并放入bean中管理,之后我们只需要在使用到接口的地方使用SpringIOC容器的@Autowird自动装配直接使用即可。因此我们还需要在Spring的核心配置文件中,配置Mapper接口的扫描MapperScannerConfigurer,指定它将某一个包下的Mapper接口创建bean对象。