● 说说Spring MVC与Struts2的不同?
(1) 核心控制器不同:spring mvc核心控制器是Servlet,而struts2是Filter。
(2) 控制器实例:理论上,spring mvc会比struts2快一些,spring mvc是基于方法设计,而struts2是基于对象,每次发一次请求都会实例化一个action。每一个action都会被注入属性,而Spring mvc更像Servlet一样,只有一个实例,每次请求执行对应的方法即可(注意:由于是单例实例,所以应当避免全局变量的修改,这样会产生线程安全问题)
(3) 管理方式:Spring MVC是Spring的一个模块,所以Spring对Spring MVC的控制器管理更加方便。
(4) 参数传递:Struts2中自身提供多种参数接收,其实都是通过ValueStack进行传递和赋值,而Spring MVC是通过方法的参数进行接收。
(5) 学习难度:Struts2学习成本比较高,比如拦截器、值栈及OGNL表达式,而Spring MVC相对简单。
(6) Intercepter的实例机制:struts有以自己的Intercepter机制,Spring MVC用到是对立的AOP方式。
(7) Spring MVC处理Ajax请求,直接通过返回数据,方法中使用注解@ResponseBody,Spring MVC自动帮我们把对象转成为JSON数据,而Struts2是通过插件的方式进行处理的。
● Spring的两大核心?
Spring是J2EE应用程序框架,是轻量级的IOC和AOP的容器框架(相对于重量级的EJB),主要是针对javaBean的生命周期进行管理的轻量级容器。
(1) IOC(Inversion of Control)或 DI(Dependency Injection):原来我们的Service需要调用DAO,Service就需要创建DAO,Spring发现你的Service需要依赖DAO,就给你注入。核心原理:就是配置文件 反射(工厂也可以) 容器(map)。
(2) AOP面向切面的编程:我们主要使用AOP来做事务、权限判断、日志等功能,核心原理:使用动态代理的方式,在执行方法前后或出现异常后加入相关逻辑。
● 说说Spring事务的传播特性?
传播特性:多个事务存在是怎么处理的策略。
(1) PROPAGATION_REQUIRED:如果存在一个事务,则支持当前事务。如果没有事务则开启。
(2) PROPAGATION_SUPPORTS:如果存在一个事务,则支持当前事务。如果没有则非事务运行。
(3) PROPAGATION_MANDATORY:如果存在一个事务,则支持当前事务。如果没有则抛异常。
(4) PROPAGATION_REQUIRED_NEW:总是开启一个事务,如果一个事务已经存在,则将这个存在的事务挂起。
(5) REQUIRED_NOT_SUPPORTS:总是非事务的执行,并挂起任何存在的事务。
(6) PROPAGATION_NEVER:总是非事务的执行,如果存在一个事务,则抛出异常。
(7) PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中,如果没有活动的事务,则按TransactionDefinition.PROPAGATION_REQUIRED属性执行。
● Mybatis和Hibernate有什么不同?
相同点:都是java的orm框架,屏蔽jdbc api的底层访问细节。
不同点:
(1) hibernate要比Mybatis功能强大很多,因为hibernate自动生成sql语句。
(2) Mybatis要比hibernate简单多,Mybatis是面向sql的。不用考虑对象间一些复杂的映射关系。
(3) 由于Mybatis需要我们在xml配置文件中写sql,hibernate我们无法直接控制语句。我们就无法去写特定的高效sql或复杂sql语句。
Mybatis好处:屏蔽jdbc api的底层访问细节。将sql语句与java代码进行分离;提供了将结果集自动封装为实体对象和对象的集合的功能。
Hibernate好处:hibernate是一个全自动的orm映射工具,他可以自动生成sql语句并执行返回java结果。
● Hibernate对象几状态?
瞬时状态:刚刚new出来,没有被持久化,没有id。(不处于session中,该对象就是临时对象)。
持久化状态/托管状态:已经被持久化,加入到session的缓存中,该状态的对象为持久化 对象。
游离状态:已经被持久化,但没有处于session中,该状态的对象为游离对象。
删除状态:对象有关联的ID,并且在session管理下,但是已经被计划删除。