本文将介绍2023年JavaWeb框架面试题,重点关注Spring、SpringMVC和Mybatis三大框架。对于准备参加JavaWeb框架面试的人来说,这些问题是必须掌握的。本文将提供一些基础问题,帮助读者更好地掌握这些框架。本文首先会介绍Spring框架的基本知识,包括IoC、AOP、Spring容器和Spring Bean等。然后,我们将讨论SpringMVC框架的主要功能和组件。接下来,我们将深入了解Mybatis框架的特点和使用方法,包括SQL映射文件、结果映射和动态SQL等。最后,我们将总结这些框架的共同点和不同点,并提供一些面试技巧和建议,帮助读者成功通过JavaWeb框架面试。
博客排版分两块:
概述是简洁版本,以大白话的方式总结陈述,直指该类面试题的核心,帮助大家成体系的记住相关面试题;
标准是参考答案,相对来说比较官方;
注意:出去面试一定要用自己的话把标准答案表达出来,体现自己的专业性,只会背诵标准答案在现在社招环境是行不通的;
常见的10个问题
①对Spring的理解
②对Spring ioc的理解
③javabean的生命周期
④依赖注入的方式
⑤自动装配的byName与byType
⑥Spring的javabean是单例还是多例,是否可以配置
⑦对Spring aop的理解
⑧对Spring aop的应用
⑨代理模式中cglib代理与jdk代理
⑩Spring中用到了哪些设计模式
大白话概述IOC与AOP
概念:轻量级的容器框架,两个核心组件IOC与AOP
IOC:控制反转,依赖注入
控制反转:将创建对象的权利由原来程序员控制转交给Spring容器进行管理
依赖注入:Spring将对象注入到另一个对象中
Spring容器中的对象默认是单例的,可以配置多例。
单例:节约内存,存在变量污染 容器生,对象生;容器死,对象死
多例:消耗内存,不存在变量污染 对象被使用的时候创建,销毁跟着jvm回收机制走;
依赖注入的方式:
set注入(自动装配)、构造注入
byname与byType的区别:
byname:根据名字找
byType:根据类型找
AOP概念:面向切面编程
作用:将共性的非核心的业务代码进行解耦
举例:常用的日志功能,系统没有日志,不影响业务功能的使用
专业术语:目标对象、连接点、通知、代理、切入点
通知:前置、后置、环绕、异常、过滤
AOP的应用:
1.日志
2.事务(transactionmanger)
前置通知:开启事务
后置通知:提交事务
异常通知:回滚事务
过滤通知:增删改需要事务,查询不需要事务
@translational
3.整合技术(github.PageHelper/mybatis-plus)
切入点 @around(excution="* *..*servcie.*Pager(..)")
代理模式中cglib代理与jdk代理
jdk代理:必须目标类与代理类实现同一个接口
cglib可以直接代理类
常见的3个问题
1.SpringMVC的工作流程
2.SpringMVC的常用注解
3.SpringMVC的结果处理
大白话概述
SpringMVC的工作流程的记录的关键点在于记住涉及到的核心对象,核心对象有效记忆可以源自于开发步骤;
开发步骤: http://ip:port/book/list
web.xml-->dispatherServlet
springmvc.xml-->viewResolver(prefix="/web-inf/"、subfix=".jsp")
Controller--->@requestMapping("/book")
list---->@getMapping("/list")
方法返回值--->list---->/web-inf/list.jsp
核心对象:
dispatherServlet、
HandlerMapping、
handlerAdapter、
modelAndView、
viewResolver、
工作流程
1.中央控制器dispatherServlet接受浏览器请求http://ip:port/book/list
2.中央控制器dispatherServlet调用处理映射器HandlerMapping,得到book/list
3.返回给中央控制器dispatherServlet
4.中央控制器dispatherServlet调用处理器适配器handlerAdapter,得到方法名
5.返回给中央控制器dispatherServlet
6.中央控制器dispatherServlet执行方法,得到方法的返回值ModelAndView
7.返回给中央控制器dispatherServlet
8.调用viewResolver解析ModelAndView,得到View视图
9.返回给中央控制器dispatherServlet
10.中央控制器dispatherServlet将视图View响应给用户
常用注解
@requestMapping/@getMapping/@post.put.delete
@pathvarliable/@requestParam/@requestBody/@requestHeader
@responseBody
@controllerAdvice/@ExceptionHandler
返回值的处理
forward
redirect
常见的3个问题
1.$与#的区别
2.结果集处理ResultType与ResultMap的区别
3.如何批量处理数据
大白话
#与$的区别
现象:#传参自带引号,$传参不带引号
select * from user where name = #{name}
select * from user where name = 'zs'
select * from user where name = '${name}'
select * from user where id = ${id}
select * from user where id = 001 or 1=1
1.#可以防止sql注入,$不行
2.$可以用来做动态列
update user set xxx...
${updateSQL}
祖传的代码不要动
commonDao.update("update biaoming set ....")
ResultType与ResultMap
ResultType:全限定名、类名,单表的查询、java.lang.string/integer
ResultMap:做映射关系,用在多表查询
一对多:Collection
一对一:association
多对多:就是两个一对多
批量插入==>二级缓存
for(Book b:books){
bookDao.insert(b)
}
以上用的是二级缓存,会反复使用新的session,消耗大量资源
以下用一级缓存,同一个session,节省服务器资源
session.beginTransation();
for(Book b:books){
session.insert(b)
}
session.commit();
javaweb基础已经被市面上问得比较少了,稍微罗列了几个重点
一、JSP
c标签:if、foreach
指令:include、page指令
九大内置对象:request、response...
二、servlet
生命周期
四大作用域
servlet结构
三、其它
Java反射技术主要实现类有哪些,作用分别是什么?
在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中
1)Class类:代表一个类
2)Field 类:代表类的成员变量(属性)
3)Method类:代表类的成员方法
4)Constructor 类:代表类的构造方法
5)Array类:提供了动态创建数组,以及访问数组的元素的静态方法
1、讲一下什么是Spring
Spring是一个轻量级的IoC和AOP容器框架。是为Java应用程序提供基础性服务的一套框架,目的是用
于简化企业应用程序的开发,它使得开发者只需要关心业务需求。常见的配置方式有三种:基于XML的
配置、基于注解的配置、基于Java的配置。
54
主要由以下几个模块组成:
Spring Core:核心类库,提供IOC服务;
Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等);
Spring AOP:AOP服务;
Spring DAO:对JDBC的抽象,简化了数据访问异常的处理;
Spring ORM:对现有的ORM框架的支持;
Spring Web:提供了基本的面向Web的综合特性,例如多方文件上传;
Spring MVC:提供面向Web应用的Model-View-Controller实现。
17、Spring的IOC和AOP机制
我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两
个是Spring的灵魂。
主要用到的设计模式有工厂模式和代理模式。
IOC就是典型的工厂模式,通过sessionfactory去注入实例。
AOP就是典型的代理模式的体现。
代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类
预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在
关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通
过调用委托类的对象的相关方法,来提供特定的服务。
spring的IOC容器是spring的核心,spring AOP是spring框架的重要组成部分。
在传统的程序设计中,当调用者需要被调用者的协助时,通常由调用者来创建被调用者的实例。但在
spring里创建被调用者的工作不再由调用者来完成,因此控制反转(IOC);创建被调用者实例的工作通
常由spring容器来完成,然后注入调用者,因此也被称为依赖注入(DI),依赖注入和控制反转是同一
个概念。
面向方面编程(AOP)是以另一个角度来考虑程序结构,通过分析程序结构的关注点来完善面向对象编程
(OOP)。OOP将应用程序分解成各个层次的对象,而AOP将程序分解成多个切面。spring AOP 只实现
了方法级别的连接点,在J2EE应用中,AOP拦截到方法级别的操作就已经足够。在spring中,未来使IoC
方便地使用健壮、灵活的企业服务,需要利用spring AOP实现为IoC和企业服务之间建立联系。
IOC:控制反转也叫依赖注入。利用了工厂模式
将对象交给容器管理,你只需要在spring配置文件总配置相应的bean,以及设置相关的属性,让spring容
器来生成类的实例对象以及管理对象。在spring容器启动的时候,spring会把你在配置文件
中配置的
bean都初始化好,然后在你需要调用的时候,就把它已经初始化好的那些bean分配给你需要 调用这些
bean的类(假设这个类名是A),分配的方法就是调用A的setter方法来注入,而不需要你在A里面new这些bean了。
注意:面试的时候,如果有条件,画图,这样更加显得你懂了.
AOP:面向切面编程。(Aspect-Oriented Programming)
AOP可以说是对OOP的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,
用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。
也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代
码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。在OOP设计中,它
导致了大量代码的重复,而不利于各个模块的重用。
将程序中的交叉业务逻辑(比如安全,日志,事务等),封装成一个切面,然后注入到目标对象(具体
业务逻辑)中去。
实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装
饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编
译器可以在编译期间织入有关“方面”的代码.
简单点解释,比方说你想在你的biz层所有类中都加上一个打印‘你好’的功能,这时就可以用aop思想来做.
你先写个类写个类方法,方法经实现打印‘你好’,然后Ioc这个类 ref=“biz.*”让每个类都注入即可实现。
2、Spring中Autowired和Resource关键字的区别
@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包 是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。
1、共同点
两者都可以写在字段和setter方法上。两者如果都写在字段上,那么就不需要再写setter方法。
2、不同点
(1)@Autowired
@Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入。
public class TestServiceImpl {
// 下面两种@Autowired只要使用一种即可
@Autowired
private UserDao userDao; // 用于字段上
@Autowired
public void setUserDao(UserDao userDao) { // 用于属性的方法上
this.userDao = userDao;
}
}
@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允 许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。如下:
public class TestServiceImpl { @Autowired @Qualifier("userDao") private UserDao userDao;
}
(2)@Resource
@Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的 名字,而type属性则解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通 过反射机制使用byName自动注入策略。
public class TestServiceImpl {
// 下面两种@Resource只要使用一种即可
@Resource(name="userDao")
private UserDao userDao; // 用于字段上
@Resource(name="userDao")
public void setUserDao(UserDao userDao) { // 用于属性的setter方法上
this.userDao = userDao;
}
}
注:最好是将@Resource放在setter方法上,因为这样更符合面向对象的思想,通过set、get去操作属 性,而不是直接去操作属性。
@Resource装配顺序:
①如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异 常。
②如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
③如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛 出异常。
④如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回 退为一个原始类型进行匹配,如果匹配则自动装配。
@Resource的作用相当于@Autowired,只不过@Autowired按照byType自动注入。
3、依赖注入的方式有几种,各是什么
一、构造器注入
将被依赖对象通过构造函数的参数注入给依赖对象,并且在初始化对象的时候注入。
优点:
对象初始化完成后便可获得可使用的对象。
缺点:
当需要注入的对象很多时,构造器参数列表将会很长;
不够灵活。若有多种注入方式,每种方式只需注入指定几个依赖,那么就需要提供多个重载的构造函
数,麻烦。
二、setter方法注入
IoC Service Provider通过调用成员变量提供的setter函数将被依赖对象注入给依赖类。
优点:
灵活。可以选择性地注入需要的对象。
缺点:
依赖对象初始化完成后由于尚未注入被依赖对象,因此还不能使用。
三、接口注入
依赖类必须要实现指定的接口,然后实现该接口中的一个函数,该函数就是用于依赖注入。该函数的参
数就是要注入的对象。
优点
接口注入中,接口的名字、函数的名字都不重要,只要保证函数的参数是要注入的对象类型即可。
缺点:
侵入行太强,不建议使用。
PS:什么是侵入行?
如果类A要使用别人提供的一个功能,若为了使用这功能,需要在自己的类中增加额外的代码,这就是
侵入性。
4、解释一下spring bean的生命周期
首先说一下Servlet的生命周期:实例化,初始init,接收请求service,销毁destroy;
Spring上下文中的Bean生命周期也类似,如下:
(1)实例化Bean:
对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入 另一个尚未初始化的依赖时,容器就会调用createBean进行实例化。对于ApplicationContext容器,当 容器启动结束后,通过获取BeanDefinition对象中的信息,实例化所有的bean。
(2)设置对象属性(依赖注入):
实例化后的对象被封装在BeanWrapper对象中,紧接着,Spring根据BeanDefinition中的信息 以及 通过BeanWrapper提供的设置属性的接口完成依赖注入。
(3)处理Aware接口:
接着,Spring会检测该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入给Bean:
①如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,此处传递的就是Spring配置文件中Bean的id值;
②如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory()方法,传递的 是Spring工厂自身。
③如果这个Bean已经实现了ApplicationContextAware接口,会调用
setApplicationContext(ApplicationContext)方法,传入Spring上下文;
(4)BeanPostProcessor:
如果想对Bean进行一些自定义的处理,那么可以让Bean实现了BeanPostProcessor接口,那将会调用
postProcessBeforeInitialization(Object obj, String s)方法。
(5)InitializingBean 与 init-method:
如果Bean在Spring配置文件中配置了 init-method 属性,则会自动调用其配置的初始化方法。
(6)如果这个Bean实现了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法;由于这个方法是在Bean初始化结束时调用的,所以可以被应用于内存或缓存技术;
以上几个步骤完成后,Bean就已经被正确创建了,之后就可以使用这个Bean了。
(7)DisposableBean:
当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的
destroy()方法;
(8)destroy-method:
最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。
5、解释Spring支持的几种bean的作用域
Spring容器中的bean可以分为5个范围:
(1) singleton:默认,每个容器中只有一个bean的实例,单例的模式由BeanFactory自身来维护。
(2) prototype:为每一个bean请求提供一个实例。
(3) request:为每一个网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回
收。
(4) session:与request范围类似,确保每个session中有一个bean的实例,在session过期后,bean
会随之失效。
(5) global-session:全局作用域,global-session和Portlet应用相关。当你的应用部署在Portlet容器
中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局
变量需要存储在global-session中。全局作用域与Servlet中的session作用域效果相同。
6、Spring基于xml注入bean的几种方式
(1) Set方法注入;
(2) 构造器注入:①通过index设置参数的位置;②通过type设置参数类型;
(3) 静态工厂注入;
(4) 实例工厂;
7、Spring框架中都用到了哪些设计模式
(1)工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;
(2)单例模式:Bean默认为单例模式。
(3)代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;
(4)模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
(5)观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被
制动更新,如Spring中listener的实现--ApplicationListener。
8、Spring MVC流程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k9zJPytr-1681863145128)(java方向面试.assets/1681721543825.png)]
看到这个图大家可能会有很多的疑惑,现在我们来看一下这个图的步骤:(可以对比MVC的原理图进行
理解)
第一步:用户发起请求到前端控制器(DispatcherServlet)
第二步:前端控制器请求处理器映射器(HandlerMappering)去查找处理器(Handle):通过xml配
置或者注解进行查找
第三步:找到以后处理器映射器(HandlerMappering)像前端控制器返回执行链(HandlerExecutionChain)
第四步:前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行处理器(Handler)
第五步:处理器适配器去执行Handler
第六步:Handler执行完给处理器适配器返回ModelAndView
第七步:处理器适配器向前端控制器返回ModelAndView
第八步:前端控制器请求视图解析器(ViewResolver)去进行视图解析
第九步:视图解析器像前端控制器返回View
第十步:前端控制器对视图进行渲染
第十一步:前端控制器向用户响应结果
看到这些步骤我相信大家很感觉非常的乱,这是正常的,但是这里主要是要大家理解springMVC中的
几个组件:
前端控制器(DispatcherServlet):接收请求,响应结果,相当于电脑的CPU。
处理器映射器(HandlerMapping):根据URL去查找处理器
处理器(Handler):(需要程序员去写代码处理逻辑的)
处理器适配器(HandlerAdapter):会把处理器包装成适配器,这样就可以支持多种类型的处理器,
类比笔记本的适配器(适配器模式的应用)
视图解析器(ViewResovler):进行视图解析,多返回的字符串,进行处理,可以解析成对应的页面
9、SpringMVC怎么样设定重定向和转发的
(1) 转发:在返回值前面加"forward:",譬如"forward:user.do?name=method4"
(2) 重定向:在返回值前面加"redirect:",譬如"redirect:http://www.baidu.com"
26、SpringMVC常用的注解有哪些
@RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示类中的所
有响应请求的方法都是以该地址作为父路径。
@RequestBody:注解实现接收http请求的json数据,将json转换为java对象。
@ResponseBody:注解实现将conreoller方法返回对象转化为json对象响应给客户。
其它:@GetMapping、@PostMapping、@PutMapping、@DeleteMapping、@Pathvariable、@RequestParam、@RequestHeader
10、什么是MyBatis
(1) Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句
本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原
生态sql,可以严格控制sql执行性能,灵活度高。
(2) MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了
几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
(3) 通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和 statement
中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对
象并返回。(从执行sql到返回result的过程)。
11、MyBatis的优点和缺点
优点:
(1) 基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在
XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重
用。
(2) 与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;
(3) 很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库
MyBatis都支持)。
(4) 能够与Spring很好的集成;
(5) 提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。
缺点:
(1) SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定
要求。
(2) SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
12、#{}和${}的区别是什么
#{}是预编译处理,${}是字符串替换。
Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
Mybatis在处理${}时,就是把${}替换成变量的值。
使用#{}可以有效的防止SQL注入,提高系统安全性。
13、当实体类中的属性名和表中的字段名不一样 ,怎么办
第1种: 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。
第2种: 通过来映射字段名和实体类属性名的一一对应的关系。
14、如何执行批量插入
首先,创建一个简单的insert语句:
然后在java代码中像下面这样执行批处理插入:
// 注意这里 executortype.batch
sqlsession sqlsession = sqlsessionfactory.opensession(executortype.batch);
try {
namemapper mapper = sqlsession.getmapper(namemapper.class);
for (string name : names) {
mapper.insertname(name);
}
sqlsession.commit();
}catch(Exception
e){ e.printStackTrace(
);
sqlSession.rollback();
throw e;
}
finally {
sqlsession.close();
}
15、MyBatis实现一对一有几种方式?具体怎么操作的
有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次, 通过在resultMap里面配置association
节点配置一对一的类就可以完成;
嵌套查询是先查一个表,根据这个表里面的结果的 外键id,去再另外一个表里面查询数据,也是通过
association配置,但另外一个表的查询通过select属性配置。
16、Mybatis是否支持延迟加载?如果支持,它的实现原理是什么
Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对
一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载
lazyLoadingEnabled=true|false。
它的原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用
a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询
关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成
a.getB().getName()方法的调用。这就是延迟加载的基本原理。
当然了,不光是Mybatis,几乎所有的包括Hibernate,支持延迟加载的原理都是一样的。
17、Mybatis的一级、二级缓存
1)一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存。
2)二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap 存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射 文件中配置 ;
3)对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear 掉并重新更新,如果开启了二级缓存,则只根据配置判断是否刷新。