SSH整合开发实战指南
Spring、Struts和Hibernate三大框架的深度整合,能构建出高扩展性、易维护的企业级应用,核心在于利用Spring的IoC容器统一管理对象生命周期,通过AOP实现横切关注点,同时集成Hibernate数据访问层和Struts控制层。

SSH整合架构设计原理
控制反转(IoC) 是整合的核心枢纽,Spring容器负责创建和管理Struts的Action对象及Hibernate的SessionFactory,实现组件解耦:
<!-- Spring托管SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">...</property>
</bean>
<!-- Struts Action由Spring创建 -->
<bean id="userAction" class="com.example.UserAction" scope="prototype">
<property name="userService" ref="userService"/>
</bean>
声明式事务 通过Spring AOP实现统一控制:
@Configuration
@EnableTransactionManagement
public class AppConfig {
@Bean
public PlatformTransactionManager transactionManager() {
return new HibernateTransactionManager(sessionFactory());
}
}
分层整合关键技术实现
数据持久层整合
-
Hibernate映射配置优化
<class name="User" table="t_user"> <id name="id" column="id"><generator class="native"/></id> <property name="name" type="string"/> <!-- 注解方式更推荐 --> </class>
-
DAO层Spring模板注入
@Repository public class UserDaoImpl extends HibernateDaoSupport implements UserDao { @Autowired public void initSessionFactory(SessionFactory sessionFactory) { setSessionFactory(sessionFactory); } public User getById(Long id) { return getHibernateTemplate().get(User.class, id); } }
业务逻辑层构建
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
public void createUser(User user) {
// 业务校验逻辑
userDao.save(user);
}
}
控制层整合策略
Struts2与Spring协同

<!-- struts.xml配置 -->
<action name="userAction" class="userAction">
<result>/userList.jsp</result>
</action>
public class UserAction extends ActionSupport {
private UserService userService; // Spring注入
public String execute() {
List<User> users = userService.listUsers();
// 数据传递到视图层
return SUCCESS;
}
}
企业级开发最佳实践
- 事务管理规范
- 在Service层使用
@Transactional注解 - 设置事务传播级别:
@Transactional(propagation=Propagation.REQUIRED) - 明确事务超时:
timeout=30
-
性能优化要点
<!-- Hibernate二级缓存配置 --> <property name="hibernate.cache.use_second_level_cache">true</property> <property name="hibernate.cache.region.factory_class"> org.hibernate.cache.ehcache.EhCacheRegionFactory </property>
-
异常处理机制
// 全局异常处理器 public class GlobalExceptionHandler extends ExceptionInterceptor { @Override public String intercept(ActionInvocation invocation) { try { return invocation.invoke(); } catch (DataAccessException e) { // 记录日志并返回错误页面 return "database_error"; } } }
调试与部署实战
典型问题解决方案:
- LazyInitializationException处理
- 使用OpenSessionInViewFilter
<filter> <filter-name>hibernateFilter</filter-name> <filter-class> org.springframework.orm.hibernate5.support.OpenSessionInViewFilter </filter-class> </filter>
- 事务失效场景排查
- 检查代理模式:确保使用CGLIB代理
- 避免同类内方法调用
SSH整合常见问题解答
Q1:整合时出现Bean创建冲突如何解决?
典型场景是Spring与Struts重复创建Action,解决方案:
- 在struts.xml中配置class属性为Spring bean的id
- 添加Struts2-Spring插件包
- 验证Spring配置文件中的action bean是否为prototype作用域
Q2:如何优化SSH应用性能?
关键优化策略包括:
- 启用Hibernate二级缓存和查询缓存
- 使用连接池(如HikariCP)替代基础DriverManager
- 批量处理操作:设置
hibernate.jdbc.batch_size=30- 避免N+1查询问题:使用JOIN FETCH优化HQL
实战思考:在微服务架构盛行的当下,传统SSH整合是否仍具有应用价值?欢迎分享您的项目经验与架构选型思考。
原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/36965.html