游客发表

ssm框架原理及流程

发帖时间:2026-10-17 04:55:23

Spring MVC 接到一个 HTTP 请求,架原DispatcherServlet 拦下来,理及流程查 HandlerMapping 找到对应的架原 Controller 方法,执行完返回一个 ModelAndView,理及流程再交给 ViewResolver 解析成具体页面。架原这套流程每天都在跑,理及流程但很多人用了几年 SSM 也没搞清楚 MyBatis 的架原 Mapper 接口明明没有实现类,为什么能直接调用。理及流程

答案在 JDK 动态代理。架原MyBatis 启动时扫描 Mapper 接口,理及流程为每个接口生成一个代理对象。架原调用接口方法时,理及流程代理拦截请求,架原把方法名和参数拼成一条 SQL 去数据库执行。理及流程XML 里的架原 <select id="selectUserById"> 和接口方法 selectUserById 靠命名约定绑定,namespace 对应接口全限定名。这套机制省掉了 DAO 实现类,但代价是调试时堆栈信息不够直观——出错只能看到代理类的调用链,得顺着 MapperMethod 往上翻才能定位到实际的 SQL 问题。

Spring 在中间做了什么

Spring 的核心就两件事:IoC 容器和 AOP 代理。IoC 容器启动时读取 XML 或注解配置,把 Bean 定义注册到 BeanDefinitionRegistry,然后通过反射实例化、属性注入、初始化,最终放进单例池。Service 层依赖 DAO 层,DAO 层依赖 DataSource,这些依赖关系全部由容器管理,不需要手动 new。

AOP 则解决横切逻辑。事务管理是最典型的例子。Spring 给标注了 @Transactional 的 Bean 生成代理对象,方法调用前开启事务,执行完提交或回滚。这里有个容易踩的坑:同类方法内部调用不走代理,事务注解会失效。因为内部调用是 this.method(),压根没经过代理对象。解法要么注入自身,要么用 AopContext.currentProxy()。

一次请求的完整链路

拿一个用户查询接口举例。浏览器发 GET /user/1 到 Tomcat,请求进入 DispatcherServlet。DispatcherServlet 先问 HandlerMapping:这个 URL 谁处理?HandlerMapping 返回 UserController.getUser 方法的处理器执行链,里面还挂了拦截器。

DispatcherServlet 调 HandlerAdapter,HandlerAdapter 负责执行 Controller 方法。方法内部调 userService.getById(1),Service 已经被 Spring 代理过,如果有事务注解,这里会先开事务。Service 再调 userMapper.selectById(1),Mapper 是 MyBatis 的代理对象,它从 SQL 映射配置里找到对应的 SQL 语句,通过 SqlSession 发给数据库连接池,执行完把 ResultSet 映射成 User 对象返回。

Controller 拿到 User 对象,放进 ModelAndView,返回给 DispatcherServlet。DispatcherServlet 把 ModelAndView 交给 ViewResolver,ViewResolver 根据配置的前后缀找到 /WEB-INF/jsp/user.jsp,渲染成 HTML 写回响应。整个链路走完,Tomcat 把响应吐给浏览器。

配置里的那些细节

web.xml 里配置 ContextLoaderListener 加载 Spring 的父容器,DispatcherServlet 加载 Spring MVC 的子容器。父容器管理 Service 和 DAO,子容器管理 Controller。子容器能访问父容器的 Bean,反过来不行。这个父子容器设计经常导致一个问题:在 Controller 里注入 Service 没问题,但在 Service 里注入 Controller 会报 NoSuchBeanDefinitionException。

MyBatis 的 SqlSessionFactory 配置里,mapperLocations 指定 XML 文件路径,typeAliasesPackage 指定实体类包名。如果这两个配错,启动时报 BindingException,提示 Invalid bound statement。实际上就是 XML 没被扫描到,或者 namespace 写错了。这种错误新手经常遇到,堆栈信息也不够直白,得手动去核对文件路径和命名空间。

SSM 说到底就是把这三块拼起来:Spring 管对象生命周期和事务,Spring MVC 管请求路由和视图解析,MyBatis 管 SQL 映射和结果集转换。理解每个环节的代理机制和容器边界,排查问题时才能找准方向。

    热门排行

    友情链接