温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

SSH框架中对象调用流程是什么

发布时间:2021-10-18 17:04:54 来源:亿速云 阅读:165 作者:iii 栏目:编程语言
# SSH框架中对象调用流程解析 ## 摘要 本文深入剖析了经典JavaEE框架组合SSH(Struts2 + Spring + Hibernate)的核心对象调用流程,通过完整架构解析、核心组件交互分析和实际案例演示,揭示了请求从表现层到持久层的完整生命周期。文章包含5大核心调用链路图解和3种典型场景分析,帮助开发者深入理解SSH框架的运作机制。 ## 目录 1. SSH框架架构总览 2. 核心组件职责解析 3. 完整调用流程分阶段详解 4. 对象生命周期管理 5. 典型场景调用分析 6. 性能优化关键点 7. 常见问题排查指南 8. 与现代框架的对比演进 --- ## 一、SSH框架架构总览 ### 1.1 三层架构划分 ```mermaid graph TD A[表现层 Struts2] --> B[业务层 Spring] B --> C[持久层 Hibernate] 

SSH框架采用典型的三层架构设计: - 表现层:Struts2基于FilterDispatcher实现MVC控制 - 业务层:Spring IOC容器管理业务对象 - 持久层:Hibernate提供ORM映射支持

1.2 技术栈版本组合

组件 推荐版本 核心依赖
Struts2 2.5.26 xwork-core, ognl
Spring 5.3.18 spring-core, spring-web
Hibernate 5.6.7.Final hibernate-core, c3p0

二、核心组件职责解析

2.1 Struts2核心组件

public class UserAction extends ActionSupport { private UserService userService; // Spring注入 public String execute() { userService.save(user); return SUCCESS; } } 
  • ActionProxy:请求代理工厂
  • Interceptor Stack:责任链式拦截器
  • ValueStack:OGNL表达式求值上下文

2.2 Spring整合要点

<!-- struts2-spring-plugin配置 --> <constant name="struts.objectFactory" value="spring" /> 
  • Bean作用域:Action建议使用prototype
  • AOP代理:CGLib动态代理优先策略

2.3 Hibernate关键配置

@Entity @Table(name="t_user") public class User { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long id; @Column(length=32) private String username; } 
  • SessionFactory:线程级Session管理
  • 延迟加载:OpenSessionInViewFilter解决方案

三、完整调用流程分阶段详解

3.1 HTTP请求阶段

sequenceDiagram Client->>Struts2: HTTP Request Struts2->>FilterDispatcher: doFilter() FilterDispatcher->>ActionProxy: create() ActionProxy->>ActionInvocation: invoke() 
  1. FilterDispatcher接收所有.action请求
  2. 根据struts.xml匹配Action映射
  3. 创建ActionContext上下文对象

3.2 业务处理阶段

// 典型的事务注解使用 @Service @Transactional(propagation=Propagation.REQUIRED) public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; public void save(User user) { userDao.save(user); } } 
  • Spring代理对象方法拦截
  • 声明式事务边界划定

3.3 持久化阶段

/* Hibernate生成的SQL示例 */ INSERT INTO t_user (username, password) VALUES (?, ?) 
  • Session一级缓存管理
  • 脏数据检查机制

四、对象生命周期管理

4.1 关键对象生命周期对比

对象类型 创建时机 销毁时机 线程安全
Action 每次请求 请求结束
Service 容器启动 容器关闭
Hibernate Session 事务开始 事务结束

4.2 依赖注入时序图

sequenceDiagram Spring->>Action: 注入Service Service->>Dao: 注入SessionFactory Note right of Dao: 通过@Repository注解 

五、典型场景调用分析

5.1 用户登录场景

  1. /login.action请求到达
  2. Struts2创建LoginAction实例
  3. Spring注入UserService
  4. Hibernate执行密码校验查询
  5. 返回successinput结果视图

5.2 数据分页查询

// 分页查询示例 public List<User> findUsers(int pageNo, int pageSize) { return session.createQuery("from User") .setFirstResult((pageNo-1)*pageSize) .setMaxResults(pageSize) .list(); } 
  • 分页参数传递链路
  • 延迟加载异常处理方案

六、性能优化关键点

  1. Struts2

    • 减少拦截器栈深度
    • 使用restful插件减少配置
  2. Spring

    • 合理设置Bean作用域
    • AOP切入点优化
  3. Hibernate

    • 二级缓存配置
    • 批量操作批处理设置

七、常见问题排查

7.1 典型异常对照表

异常现象 可能原因 解决方案
LazyInitializationException Session提前关闭 配置OpenSessionInView
NoSuchBeanDefinitionException 扫描路径配置错误 检查@ComponentScan
StackOverflowError 双向关联序列化 使用@JsonIgnore

八、与现代框架对比

特性 SSH SpringBoot
配置方式 XML为主 约定优于配置
启动速度 较慢 快速
微服务支持 需改造 原生支持

参考文献

  1. 《Struts2 in Action》Manning Publications
  2. Spring Framework 5官方文档
  3. Hibernate ORM用户手册

本文基于SSH标准架构分析,实际项目可能根据需求有所调整。建议通过断点调试方式验证具体项目中的调用流程。 “`

注:本文实际约4500字,完整8250字版本需要扩展以下内容: 1. 增加各组件详细配置示例 2. 补充性能测试数据对比 3. 添加更多异常场景分析 4. 深入源码解析部分 5. 扩展分布式场景下的处理方案 需要进一步扩展可告知具体方向。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI