SSH框架核心知识与面试要点
在Java Web开发领域,SSH框架(Struts+Spring+Hibernate)曾是经典的三层架构代表。面试中,考官常围绕框架分工、集成逻辑及关键组件展开提问,需重点掌握其核心设计思想与运行机制。
1. SSH框架的分层与协作
SSH系统从职责上划分为表示层、业务逻辑层、数据持久层和实体层。Struts负责MVC模式的控制层,通过核心过滤器StrutsPrepareAndExecuteFilter拦截请求,结合struts.xml配置实现Action与视图的映射;Spring作为容器,通过IOC(控制反转)管理Bean生命周期,AOP(面向切面)实现事务、日志等非业务逻辑的解耦;Hibernate则是ORM(对象关系映射)框架,通过.hbm.xml文件定义实体与数据库表的映射,将Java对象操作转化为SQL执行。
典型调用链路为:JSP页面发送请求→Struts核心过滤器匹配Action→调用Service层业务逻辑→通过DAO层Hibernate操作数据库→返回结果至视图。其中,Spring的IOC特性尤为关键——它通过XML或注解配置动态注入依赖,避免了传统代码中硬编码的new对象操作,显著降低了模块间耦合。
2. Struts2的运行原理与常见问题
Struts2基于MVC模式设计,核心是通过过滤器拦截以.action结尾的请求。当请求到达时,核心控制器会解析URL路径,匹配struts.xml中定义的Action名称与方法名(如路径为/user!list.action时,匹配UserAction类的list方法)。处理完成后,返回的字符串结果会映射到struts.xml的result标签,跳转至对应页面。
面试中常问:“Struts2如何实现参数传递?”答案需提及OGNL(对象图导航语言)——它支持访问对象属性、调用方法及类型转换,是JSP与Action间数据交互的核心工具。此外,需注意web.xml中Struts过滤器的配置顺序,避免与其他过滤器冲突。
3. Spring的IOC与AOP深度解析
Spring的轻量级特性体现在两方面:一是JAR包体积小(核心包仅1MB左右),二是非侵入式设计(业务类无需继承Spring特定类)。IOC的本质是“对象创建权反转”——由Spring容器管理Bean的实例化与依赖注入。例如,Service层调用DAO层时,无需手动new DAO对象,而是通过@Autowired注解自动注入,实现代码与具体实现的解耦。
AOP则通过动态代理(JDK代理或CGLIB)将事务、日志等横切逻辑与业务代码分离。以事务管理为例,可在applicationContext.xml中配置aop:config,通过切入点表达式(如对Service层的add*、update*方法)拦截请求,结合tx:advice定义事务传播特性(如REQUIRED:无事务则新建,有则加入)。需注意,Spring默认事务传播行为是REQUIRED,而只读事务(read-only=true)可提升查询性能。
4. Hibernate的ORM机制与关键特性
Hibernate作为全自动ORM框架,通过映射文件(.hbm.xml)将Java对象与数据库表关联,支持自动生成SQL语句。其核心类包括Configuration(加载配置)、SessionFactory(生成Session)、Session(执行CRUD操作)及Transaction(事务管理)。例如,通过session.save(user)即可完成用户对象的持久化,无需编写INSERT语句。
面试高频问题包括:“get()与load()的区别”——get()直接查询数据库,无结果返回null;load()默认懒加载(仅加载对象ID,访问其他属性时触发查询),无结果抛异常。此外,Hibernate的一级缓存(Session级)与二级缓存(SessionFactory级)需重点说明:一级缓存自动开启,用于同一Session内的重复查询;二级缓存需配置第三方库(如Ehcache),提升跨Session的查询效率。
SSM框架:从经典到主流的演进
随着技术发展,SSM框架(Spring MVC+Spring+MyBatis)逐渐替代SSH,成为当前企业级开发的主流选择。其优势在于Spring MVC的轻量灵活、MyBatis的半自动化SQL控制,更符合现代开发对性能与可维护性的需求。
1. Spring MVC的请求处理流程
Spring MVC的核心是DispatcherServlet(前端控制器),其运行流程可概括为:接收HTTP请求→通过HandlerMapping匹配处理器(如@Controller注解的类方法)→调用处理器处理请求并返回ModelAndView→通过ViewResolver解析视图(如JSP、Thymeleaf模板)→渲染数据后返回响应。
关键注解包括:@RequestMapping(定义URL映射)、@RequestParam(绑定请求参数)、@ResponseBody(返回JSON数据)。需注意,Spring与Spring MVC是父子容器关系——Spring是父容器,管理Service、DAO等Bean;Spring MVC是子容器,管理Controller。子容器可访问父容器Bean,但父容器无法访问子容器,因此事务配置需放在父容器中,避免Controller层事务失效。
2. MyBatis的半自动化与缓存机制
MyBatis定位为“半自动化ORM框架”,既避免了JDBC的繁琐编码,又保留了对SQL的灵活控制。通过XML映射文件或注解(如@Select)定义SQL语句,支持参数绑定(#{param})与结果集自动封装(通过resultMap)。例如,编写即可实现用户查询。
缓存方面,MyBatis一级缓存(SqlSession级)默认开启,同一SqlSession内重复查询会直接从缓存取数据;二级缓存(Mapper级)需在配置文件中启用,支持跨SqlSession共享。需注意,增删改操作会清空缓存,确保数据一致性。与Hibernate相比,MyBatis的优势在于SQL可优化(如手写复杂查询),适合对性能要求高的场景;而Hibernate的全自动特性更适合快速开发简单业务。
微服务与Spring生态:从单体到分布式的跨越
随着业务规模扩大,微服务架构(Microservices)成为解决单体应用复杂度的关键。Spring Boot与Spring Cloud的组合,为微服务开发提供了一站式解决方案,涵盖快速启动、服务治理、分布式配置等核心功能。
1. Spring Boot的“约定优于配置”
Spring Boot通过自动配置(Auto-configuration)简化开发,只需引入starter依赖(如spring-boot-starter-web),即可自动装配Web所需的Tomcat、Spring MVC等组件。其核心注解@SpringBootApplication(包含@Configuration、@EnableAutoConfiguration、@ComponentScan)标记启动类,需放置在根包下以确保组件扫描生效。
整合MyBatis时,只需添加mybatis-spring-boot-starter依赖,在application.properties中配置数据源(spring.datasource.url/jdbc.driver-class-name),并通过@Mapper注解标记DAO接口,即可实现接口与XML映射文件的绑定。此外,Spring Boot支持Thymeleaf、Freemarker等模板引擎,通过th:text、th:each等标签实现页面动态渲染,适合需要静态化的活动页开发。
2. Spring Cloud的微服务治理
Spring Cloud是微服务的“大管家”,集成了服务注册与发现(Eureka)、负载均衡(Ribbon)、熔断(Hystrix)、配置中心(Config Server)等组件。例如,Eureka作为注册中心,管理各微服务实例的IP与端口;Ribbon通过客户端负载均衡(如轮询、随机策略)分配请求;Hystrix则通过熔断机制防止服务雪崩——当某个服务不可用时,快速返回默认值,避免级联故障。
实际项目中,微服务间通过REST API或Feign(声明式HTTP客户端)通信。例如,订单服务调用用户服务时,只需定义@FeignClient注解的接口,即可像调用本地方法一样调用远程服务。此外,Spring Cloud Config支持集中管理各环境配置(开发、测试、生产),通过Git仓库存储配置文件,实现动态刷新。
总结:框架面试的核心应答策略
Java框架面试的核心是“理解原理、熟悉配置、结合实战”。对于SSH/SSM,需掌握各层分工与集成逻辑;对于微服务,需明确Spring Boot/Cloud的关键组件与解决的问题。应答时,可结合项目经验说明框架选择的原因(如MyBatis适合复杂SQL场景)、遇到的问题(如Hibernate懒加载异常)及解决方案(如使用Open Session In View模式),展现对技术的深度理解与实践能力。
最后,建议求职者通过实际项目演练(如用SSM搭建博客系统、用Spring Cloud实现电商微服务)加深对框架的掌握,同时关注技术社区(如GitHub、Stack Overflow)的最新动态,确保知识体系与时俱进。




