对Spring框架的理解?
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架;也就是解耦和,在不改变依赖的类的情况下,修改依赖关系。
IOC:控制反转也就是依赖注入。利用了工厂模式将对象交给容器管理,只需要在spring配置文件中配置相应的bean,以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象。在spring容器启动的时候,spring会把你在配置文件中配置的bean都初始化好,然后在你需要调用的时候,就把它已经初始化好的那些bean分配给你需要调用这些bean的类(假设这个类名是A),分配的方法就是调用A的setter方法来注入,而不需要你在A里面new这些bean了。
首先,需要说明的一点,AOP只是Spring的特性,它就像OOP一样是一种编程思想,并不是某一种技术,AOP可以说是对OOP的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。将程序中的交叉业务逻辑(比如安全,日志,事务等),封装成一个切面,然后注入到目标对象(具体业务逻辑)中去。
实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。
简单点解释,比方说你想在你的biz层所有类中都加上一个打印‘你好,AOP’的功能这你经可以用aop思想来做,你先写个类写个方法,方法经实现打印‘你好,AOP’让后你Ioc这个类 ref=“biz.*”让每个类都注入。
对SpringMVC框架的理解?
SpringMVC就是Spring框架的一个模块,他可以和Spring框架进行无缝整合,它是一个基于mvc设计思想的前端web框架,主要作用就是对前端请求进行处理。它的前端控制器是一个servlet,它的请求拦截是基于方法级别的,它的执行流程是
SpringMVC框架主要由DispatcherServlet、处理器映射、处理器(控制器)、视图解析器、视图组成
1.客户端请求提交到DispatcherServlet
2.由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller
3.DispatcherServlet将请求提交到Controller
4.Controller调用业务逻辑处理后,返回ModelAndView
5.DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图
6.视图负责将结果显示到客户端
Springmvc概括来说就是request请求到中央控制器à传到映射处理器à转发到指定controllerà获取数据和view,组成ModelAndView组件à通过ViewResolver返回到特定的前端页面,Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。
对Struts2框架的理解?
它是一个基于mvc设计思想的前端web层框架,主要作用就是对前端请求进行处理。他的核心是拦截器,但是它的前端控制器是一个过滤器,它的请求拦截是基于类级别,OGNL也提供了在Struts2里访问各种作用域中的数据的简单方式,大大简化了获取数据的代码,Struts2的执行流程是:
A. 页面请求传递到后台, 首先进入Struts2 的核心StrutsPrepareAndExecutedFilter .
B. 请求进入到struts2 之后, 会根据请求的路径到 struts.xml 文件中根据 package的 namespace 属性 与 action 的 name 属性配置到请求处理的Action 类.
C. 匹配到对应 Action 类的对应方法 , 执行该方法进行业务处理, 处理完毕之后会返回一个结果视图(字符串).
D. 然后根据返回的结果视图 , 到struts.xml 中对应的Action的result结果集配置中 匹配 对应的视图页面(或action).
E. 然后根据 result 的type属性, 转发(或重定向) 对应的页面(或action).
SpringMVC和Struts2两个框架对比
1.SpringMVC入口是一个Servlet前端控制器,Struts2入口是一个filter过滤器
2.Struts2通过action类中定义成员变量接收请求参数,只能使用多例模式管理Action;SpringMVC通过在controller方法中定义形参接收请求参数,可以使用单例模式管理controller
3.SpringMVC是基于方法开发的注解开发中使用requestMapping将url和方法进行映射,如果根据url找到controller类的方法生成一个Handler处理器对象(只包括一个method);Struts2是基于类开发,每个请求过来创建一个action实例,实例对象中有若干的方法
4.Struts2采用值栈存储请求和响应的数据,通过OGNL存取数据,SpringMVC通过参数绑定器将request请求内容解析,并给方法形参赋值。
Hibernate和Mybatis对比
1.在移植性方面hibernate配置一下方言即可,而一般情况下Mybatis则需要修改sql语句
2.hibernate是一个完全的ORM框架,完全的面向对象,更符合我们开发者的思维模式;Mybatis需要手动写sql语句
3. hibernate的优化成本比较高.因为hibernate的sql语句是自动生成的,所以在优化方面一般的新手无从下手.而mybatis只要修改sql就可以了.更加容易上手
对Mybatis框架的理解
Mybatis是一个优秀的ORM框架,它对jdbc的操作数据库过程进行了封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建connection等jsbc繁杂的过程代码,一般使用mapper代理的方式开发,直接在xml里面写sql
Mybatis的工作流程
1.mybatis配置
SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了Mybatis的运行环境等信息。
Mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句,此文件需要在SqlMapConfig.xml中加载。
2.通过Mybatis环境等配置信息构造SqlSessionFactory即会话工厂
3.由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行
4.Mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器
5.Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
6.Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过 Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。 7、 Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过 Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。
对Hibernate框架的理解
Hibernate是轻量级的持久层解决方案,是一个关系数据库ORM框架, 对JDBC访问数据库的代码做了封装.我们可以很容易的对数据库进行增删改查操作.
执行原理:
1.读取并解析核心配置文件
2.Configuration负责读取并创建映射信息,创建SessionFactory会话工厂。
3.SessionFactory会话工厂构建Session对象。
4.Transaction开启事务。
5.进行可持久化操作。
6.Transaction提交事务。
7.关闭Session及SessionFactory。
持久化对象的三种状态:
瞬时态:不存在唯一标识OID , 与session未建立关联,未在数据库中存在。
持久态:存在唯一标识OID , 与session已建立关联,在数据库中存在;
当属性发生改变时,清理缓存时会自动和数据库同步。
脱管(离线)态:不存在唯一标识OID , 与session不存在关联,但在数据库中存在。
Hibernate查询方式?
1)主键查询
User u=(User)session.get(User.class, 1);
User u=(User)session.load(User.class, 1);支持懒加载
2)HQL查询
3)Criteria查询
4)本地sql查询
sql和hql的区别?
1)sql是直接操作数据库的
2)hql是通过操作对象操作数据库,对大小写敏感
一级缓存和二级缓存的区别?
一级缓存是session级别的缓存,二级缓存是sessionFactory级别的缓存
hibernate中get和load的区别
get和load都是根据id获取数据
1)get先查询session中对应id是否有数据,如果有则直接返回,有查询数据库,如数据库没有则返回null;
2)load方式查询session中对应id是否有数据,如果没有生成代理对象,查询数据库。没有对应id则抛出异常