在前面的一篇关于框架中已经讲过了以下几点,另外再针对框架中的盲点进行扫雷,将现有的框架中的一些知识点进行强化。
Spring中AOP主要用来做什么。
Mybatis的mapper文件中#和$的区别。
Mybatis中DAO层接口没有写实现类,Mapper中的方法和DAO接口方法是怎么绑定到一起的,其内部是怎么实现的。
1.Hibernate和Mybatis的区别。
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,建立对象与数据库表的映射。是一个全自动的、完全面向对象的持久层框架。Mybatis是一个开源对象关系映射框架,原名:ibatis,2010年由谷歌接管以后更名。是一个半自动化的持久层框架。
开发方面的区别:
- hibernate开发中,sql语句已经被封装,直接可以使用,加快系统开发;
- Mybatis 属于半自动化,sql需要手工完成(专注与Sql本身),稍微繁琐;
但是,凡事都不是绝对的,如果对于庞大复杂的系统项目来说,发杂语句较多,选择hibernate 就不是一个好方案。
sql优化方面:
- Hibernate 自动生成sql,有些语句较为繁琐,会多消耗一些性能;
- Mybatis 手动编写sql,可以避免不需要的查询,提高系统性能;
对象管理比对:
- Hibernate 是完整的对象-关系映射的框架,开发工程中,无需过多关注底层实现,只要去管理对象即可;
- Mybatis 需要自行管理映射关系;
缓存机制:
- Hibernate的二级缓存配置在SessionFactory生成的配置文件中进行详细配置,然后再在具体的表-对象映射中配置是那种缓存。
- MyBatis的二级缓存配置都是在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且Mybatis可以在命名空间中共享相同的缓存配置和实例,通过Cache-ref来实现。
Mybatis:小巧、方便、高效、简单、直接、半自动化。hibernate适用于需求变化不多的中小型项目,比如:后台管理系统,orm、oa......
Hibernate:强大、方便、高效、复杂、间接、全自动化。mybatis适用于需求变化较多的项目,比如:互联网项目。
2.什么是IOC,什么是依赖注入。
IoC -- Inversion of control, 控制反转。IoC意味着将你设计好的对象交给容器控制,是一种减少类与类之间依赖的设计原则.有了IoC容器后, 把创建对象和查找依赖对象的控制权交给了容器, 由容器进行注入组合对象, 所以对象与对象之间是松散耦合, 这样也方便测试, 利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活.
DI -- Dependency Injection,依赖注入。即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中.
同一个概念的不同角度的描述。控制反转(IoC)从 IoC容器的角度来说。依赖注入(DI) 从应用程序的角度来说
3.Spring用了哪些设计模式。
简单工厂,又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建还是传入参数前创建
工厂模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。Spring中的FactoryBean就是典型的工厂方法模式。
单例模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点。Spring中的单例模式完成了后半句话,即提供了全局的访问点BeanFactory。但没有从构造器级别去控制单例,这是因为Spring管理的是是任意的Java对象。
代理模式,在Aop实现中用到了JDK的动态代理;
观察者模式,定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
策略模式,定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
4.Spring注入bean的方式。
5.Spring中controller是单例还是多例,怎么修改。
6.Spring事务隔离级别和传播性。
7.介绍下Mybatis的缓存机制。
MyBatis 提供了查询缓存来缓存数据,以提高查询的性能。MyBatis 的缓存分为一级缓存和二级缓存。
一级缓存是 SqlSession 级别的缓存
二级缓存是 mapper 级别的缓存,多个 SqlSession 共享
8.Spring MVC和Struts2的区别。
1. 机制:
spring mvc的入口是servlet,而struts2是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 ,然后直接返回响应文本即可。