Struts2和Spring MVC 区别 今天面试被问到了
虽然说没有系统的学习过Spring MVC框架, 但是工作这么长时间, 基本上在WEB层使用的都是Spring MVC, 自己觉得Struts2也是一个不错的WEB层框架, 这两种框架至今自己还未有比较, 今天闲着没事干, 从网上找了一些资料, 再加上平时使用Spring MVC的感触来总结一下。
Spring MVC PK Struts2
我们用struts2时采用的传统的配置文件的方式,并没有使用传说中的0配置。spring3 mvc可以认为已经100%零配置了(除了配置spring mvc-servlet.xml外)。
Spring MVC和Struts2的区别:
1. 机制:spring mvc的入口是servlet,而struts2是filter(这里要指出,filter和servlet是不同的。以前认为filter是servlet的一种特殊),这样就导致了二者的机制不同,这里就牵涉到servlet和filter的区别了。
2. 性能:spring会稍微比struts快。spring mvc是基于方法的设计,而sturts是基于类,每次发一次请求都会实例一个action,每个action都会被注入属性,而spring基于方法,粒度更细,但要小心把握像在servlet控制数据一样。spring3 mvc是方法级别的拦截,拦截到方法后根据参数上的注解,把request数据注入进去,在spring3 mvc中,一个方法对应一个request上下文。而struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用setter getter方法把request中的数据注入;struts2实际上是通过setter getter方法与request打交道的;struts2中,一个Action对象对应一个request上下文。
3. 参数传递:struts是在接受参数的时候,可以用属性来接受参数,这就说明参数是让多个方法共享的。
4. 设计思想上:struts更加符合oop的编程思想, spring就比较谨慎,在servlet上扩展。
5. intercepter的实现机制:struts有以自己的interceptor机制,spring mvc用的是独立的AOP方式。这样导致struts的配置文件量还是比spring mvc大,虽然struts的配置能继承,所以我觉得论使用上来讲,spring mvc使用更加简洁,开发效率Spring MVC确实比struts2高。spring mvc是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上spring3 mvc就容易实现restful url。struts2是类级别的拦截,一个类对应一个request上下文;实现restful url要费劲,因为struts2 action的一个方法可以对应一个url;而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。spring3 mvc的方法之间基本上独立的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架方法之间不共享变量,而struts2搞的就比较乱,虽然方法之间也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码,读程序时带来麻烦。
6. 另外,spring3 mvc的验证也是一个亮点,支持JSR303,处理ajax的请求更是方便,只需一个注解@ResponseBody ,然后直接返回响应文本即可。
自我总结:
MyBatis 和 Hibernate 都是 Java 开发中常用的持久层框架,它们在很多方面存在区别,以下为你详细分析并举例说明:
1. 开发方式与 SQL 控制程度
- MyBatis
- 特点:是一个半自动化的 ORM(对象关系映射)框架,它更侧重于 SQL 的编写和控制。开发者需要手动编写 SQL 语句,对数据库的操作细节有很高的掌控度。
- 举例:在查询用户信息时,使用 MyBatis 可以这样编写 SQL 语句:
<select id="getUserById" parameterType="int" resultType="com.example.User">
SELECT * FROM users WHERE id = #{id}
</select>
这里可以根据具体需求灵活编写 SQL,比如使用复杂的 JOIN 操作、子查询等。
- Hibernate
- 特点:是一个全自动化的 ORM 框架,它会根据对象的映射关系自动生成 SQL 语句,开发者无需过多关注 SQL 细节,只需要操作对象即可。
- 举例:在 Hibernate 中,查询用户信息可以这样写:
Session session = sessionFactory.openSession();
Query query = session.createQuery("FROM User WHERE id = :id");
query.setParameter("id", 1);
User user = (User) query.uniqueResult();
Hibernate 会根据 FROM User WHERE id = :id
自动生成相应的 SQL 语句。
2. 学习成本
- MyBatis
- 特点:由于需要手动编写 SQL,开发者需要对数据库和 SQL 有较深入的了解。但对于熟悉 SQL 的开发者来说,上手相对容易。
- 举例:如果开发者之前有丰富的 SQL 开发经验,使用 MyBatis 可以快速根据业务需求编写高效的 SQL 语句,实现复杂的数据库操作。
- Hibernate
- 特点:学习成本相对较高,因为它有自己的一套对象映射规则和查询语言(HQL),开发者需要花费时间学习这些规则和语言。
- 举例:对于初学者来说,理解 Hibernate 的对象映射配置(如
@Entity
、@Column
等注解)和 HQL 的语法需要一定的时间和精力。
3. 性能表现
- MyBatis
- 特点:由于开发者可以手动优化 SQL,对于复杂的查询和对性能要求较高的场景,MyBatis 可以通过编写高效的 SQL 来提高性能。
- 举例:在一个电商系统中,需要查询某个时间段内的销售数据,并且要对数据进行复杂的统计和排序。使用 MyBatis 可以编写针对性的 SQL 语句,直接与数据库交互,避免不必要的性能开销。
- Hibernate
- 特点:虽然 Hibernate 有一定的性能优化机制,但由于它自动生成 SQL,可能会生成一些性能不佳的 SQL 语句。尤其是在处理复杂查询时,性能可能不如 MyBatis。
- 举例:在处理复杂的多表关联查询时,Hibernate 自动生成的 SQL 可能会包含一些不必要的连接和子查询,导致查询性能下降。
4. 可维护性
- MyBatis
- 特点:当数据库表结构发生变化时,需要手动修改对应的 SQL 语句,维护工作量相对较大。但 SQL 语句直观,易于理解和调试。
- 举例:如果数据库中
users
表新增了一个字段,在 MyBatis 中需要修改相应的 SQL 语句,如SELECT
语句要添加新字段,INSERT
和UPDATE
语句也要做相应调整。
- Hibernate
- 特点:当数据库表结构发生变化时,只需要修改对象的映射关系,Hibernate 会自动调整生成的 SQL 语句,维护相对方便。但由于对象映射关系和 HQL 语句的存在,代码的可读性和可维护性可能会受到一定影响。
- 举例:如果
users
表新增了一个字段,在 Hibernate 中只需要在User
类中添加对应的属性,并使用注解进行映射,无需修改 HQL 语句。
总结
MyBatis 适合对 SQL 有较高要求、需要灵活控制数据库操作的场景,如复杂的业务查询和性能优化。Hibernate 则适合对开发效率要求较高、数据库表结构相对稳定的场景,它可以减少开发者编写 SQL 的工作量,提高开发效率。在实际项目中,需要根据具体需求和团队技术水平来选择合适的框架。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix