第一部分:Spring
1.简述什么是Spring框架
轻量级的Java开发框架,核心是IOC(控制反转)和APO(面向切面编程),主要作用是降低代码的耦合度
2.什么是IOC和AOP
IOC: 控制反转,负责控制对象的生命周期和对象间的关系
AOP: 面向切面编程,对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
3.Spring中bean的作用域
Bean: 组成应用程序的主体及由Spring IOC容器所管理的对象,被称之为bean
作用域:
1.singleton: 单例模式,在整个容器中,使用singleton定义的Bean只有一个实例
2.prototype: 原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例
3.request: 对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例.只有在Web应用中使用Spring时,该作用域才有效
4.session: 对于每次HTTP Session,使用session定义的Bean豆浆产生一个新实例.同样只有在Web应用中使用Spring时,该作用域才有效
5. globalsession: 每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例.典型情况下,仅在使用portletcontext的时候有效.同样只有在Web应用中使用Spring时,该作用域才有效
4.Spring框架中的Bean是线程安全的么?
不安全,当单例中存在竞态条件,即有线程安全问题
5.@Autowired和@Resource的区别
@Autowired按byType自动注入,而@Resource默认按byName自动注入
@Resource装配顺序:
1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常 1. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常 1. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常 1. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配
6.Spring中bean的生命周期
Spring的Bean的生命周期从创建Spring容器开始,直到Spring容器销毁bean结束
7.Spring的事务传播机制
考虑嵌套事务下的提交顺序,以及回滚顺序
正常处理的嵌套事务流程:
主事务开启->主事务执行->子事物开启->子事物执行->子事物提交或回滚->主事务提交或回滚
8.Spring中的事务隔离级别
1.ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对应
2.ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据.这种隔离级别会产生脏读,不可重
复读和幻像读.
3.ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取.另外一个事务不能读取该事务未提交的数据
4.ISOLATION_REPEATABLE_READ:这种事务隔离级别可以防止脏读,不可重复读.但是可能出现幻像读.它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读).
5.ISOLATION_SERIALIZABLE: 这是花费最高代价但是最可靠的事务隔离级别.事务被处理为顺序执行.除了防止脏读,不可重复读外,还避免了幻像读.
第二部分:SpringMVC
1.什么是MVC,以及简述Springmvc。
MVC:
1.视图层(View): 主要是与用户进行交互,显示页面.使用HTML,CSS,JS等实现
2.控制层(Controller): 接收所有的用户请求参数,判断请求参数是否合法,根据请求的类型调用JavaBean执行操作,并将最终的处理结果交由视图层进行显示.相当于控制器做了调度员的工作.使用Servlet实现
3.模型层(Model): 某个功能.完成一个个独立的业务操作组件,一般都是以 JavaBean 的形式进行定义的
Springmvc:
基于Java的实现了MVC设计模式的,请求驱动类型的,轻量级Web框架.
组件:
1.前端控制器 DispatcherServlet:接收请求,响应,也是中央转发器
2.处理器映射器 HandlerMapping:根据url查找Handler
3.处理器适配器 HandlerAdapter:按照特定规则去执行Handler,规则即HandlerAdapter要求的规则
4.视图解析器 ViewResolver:根据逻辑视图解析成真正的视图(view)
5.视图 View:实现类支持不同的view类型
2.SpringMVC的执行流程?
1.首先用户发送请求–>DispatherServlet
2.DispatcherServlet–>HandlerMapping
3.DispatcherServlet–>HandlerAdapter
4.HandlerAdapter–>处理器功能处理方法的调用
5.ModelAndView的逻辑视图名–>ViewRecolver
6.View–>渲染
7.返回控制权给DispatcherServlet,由DispatcherServlet返回呼应给用户,流程结束.
3.什么是重定向和转发,在SpringMVC如何实现重定向和转发?
1.重定向和转发:
转发:转发是在服务器内部实现的. 只有一次请求,一次响应. 浏览器地址栏不会有什么变化. 转发的页面是最后的路径的响应
重定向:由浏览器端进行的页面跳转,特点:地址栏发生变化;重定向可以访问其他站点(服务器)的资源;重定向是两次请求,不能使用request对象来共享数据
2.如何实现重定向和转发:
通过HttpServletResponse进行输出,实现重定向,转发
4.@RestController和 @Controller区别是什么?
@RestController注解相当于@ResponseBody+@Controller合在一起的作用
1.只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,配置的视图解析器InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容.
2.需要返回到指定页面,则需要用 @Controller配合视图解析器InternalResourceViewResolver才行.
3.需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解.
5.SpringMVC中拦截器如何实现?
1.通过实现HandlerInterceptor接口,或继承HandlerInterceptor接口的实现类来定义.
2.通过实现WebRequestInterceptor接口,或继承WebRequestInterceptor接口的实现类来定义.
6.拦截器和过滤器的区别?
1.拦截器是基于java的反射机制的,而过滤器是基于函数的回调.
2.拦截器不依赖于servlet容器,而过滤器依赖于servlet容器.
3.拦截器只对action请求起作用,而过滤器则可以对几乎所有的请求起作用.
4.拦截器可以访问action上下文,值,栈里面的对象,而过滤器不可以.
5.在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次.
6.拦截器可以获取IOC容器中的各个bean,而过滤器不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑.
7.什么是RESTFUL?
RESTFUL是一种架构的规范与约束,原则,符合这种规范的架构就是RESTful架构.
第三部分:MyBatis
1.什么是MyBatis?
1.MyBatis是一持久层框架
2.支持自定义 SQL,存储过程以及高级映射.
3.免除了几乎所有的 JDBC代码以及设置参数和获取结果集的工作.
4.可以通过简单的 XML 或注解来配置和映射原始类型,接口和 Java POJO为数据库中的记录.
2. #{} 和 ${} 的区别?
#{}是预编译处理,是占位符,${}是字符串替换,是拼接符
3.简述MyBatis一级和二级缓存?
一级缓存:
一级缓存是指Session缓存.一级缓存的作用域默认是SqlSession.Mybatis默认开启一级缓存.
同一个SqlSession中,执行相同的查询SQL,第一次会去数据库进行查询,并写到缓存中;第二次以后则直接去一级缓存中取.当执行的SQL查询中间发生了增删改的操作,mybatis会把SqlSession的缓存清空.
二级缓存:
二级缓存是指mapper映射文件.二级缓存的作用域是同一个nameSpace下的mapper映射文件内容,多个SqlSession共享.Mybatis需要手动设置启动二级缓存.
4.如何获取自增的主键?
在xlm文件里欲获取的自增主键所在的标签中加上:
useGeneratedKeys="true" keyProperty="xxx" keyColumn="xxx"
keyProperty所对应的是实体类中的属性名,keyColumn所对应的是数据库中的列名
5. resultType 和 resultMap的区别?
1.ResultType相对与ResultMap而言更简单一点,只有满足对象映射关系时即数据库表中的字段名和实体类中的属性完全一致时,才能使用,否则会出现数据不显示的情况.
2.ResultMap和ResultType的功能类似,但是ResultMap更强大一点,ResultMap可以实现将查询结果映射为复杂类型的pojo.
6.当实体类属性名和表中字段名不一致时如何处理?
1.定义字段名的别名,让字段名的别名和实体类的属性名一致
2.通过<resultMap>来映射字段名和实体类属性名的一一对应的关系.
7.接口中传递多个参数时如何处理?
1.封装对象,把要传的多个参数封装成一个对象传入
2.在访问路径中嵌入变量,使用@PathVariable注解,在请求路径中写 "/demo/{1}/{2}",然后在请求路径中相应的位置替换为要穿的参数即可,这种也只适用于包装类,如String
3.改变请求的content type,使用content-type: application/x-www-form-urlencoded
,这种使用form表单提交的形式,可以传入两个参数,要结合使用@FormParam注解