Spring+SpringMVC+SpringBoot+MyBatis面试题
什么是Spring框架?使用Spring框架的好处是什么?
Spring是一款开源的轻量级Java开发框架,可以提高开发人员的开发效率以及系统的可维护性。Spring框架是很多模块的集合,使用这些模块可以很方便地协助我们进行开发,比如说Spring支持IoC(控制反转),通过控制反转实现了松散耦合;Spring支持AOP(面向切面编程),可以把应用业务逻辑和系统服务分开。Spring容器包含并管理应用中对象的生命周期和配置;Spring提供了一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务。
Spring的核心是什么?
Spring框架包含众多模块,如Core、Test、Data Access、Web 等,其中Core是整个Spring框架的核心模块。Core模块提供了IoC容器、AOP、数据绑定、类型转换等功能,而这些功能以及其他模块的功能都是建立在IoC和AOP之上的,所以IoC和AOP是Spring框架的核心。
IoC(控制反转):这是一种面向对象编程的设计思想,在不采用这种思想的情况下,我们需要自己维护对象与对象之间的依赖关系,很容易造成对象之间的耦合度过高。IoC可以帮我们维护对象与对象之间的依赖关系,降低对象之间的耦合度。IoC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,不用考虑对象是如何被创建出来的。
AOP(Aspect Oriented Programing)是面向切面编程思想,我们可以将解决共性需求的代码独立出来,然后通过配置的方式,声明这些代码在什么地方、什么时机调用。当满足调用条件时,AOP会将该业务代码织入到我们指定的位置,从而统一解决了问题。能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,这样便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。
Spring容器
Spring主要提供了两种类型的容器:BeanFactory和ApplicationContext。
BeanFactory:BeanFactory是类的通用工厂,它可以创建并管理各种类的对象。这些可被创建和管理的对象称为Bean,所有可以被Spring容器实例化并管理的Java类都可以成为Bean。BeanFactory提供完整的IoC服务支持,如果没有特殊指定,默认采用延迟初始化策略。只有当客户端对象需要访问容器中的某个受管对象的时候,才对该受管对象进行初始化以及依赖注入操作。
ApplicationContext:它是在BeanFactory的基础上构建的,除了拥有BeanFactory的所有支持,ApplicationContext还提供了其他高级特性,比如事件发布、国际化信息支持等。ApplicationContext所管理的对象,在该类型容器启动之后,默认全部初始化并绑定完成。所以,相对于BeanFactory来说,ApplicationContext要求更多的系统资源,同时,因为在启动时就完成所有初始化,容器启动时间较之BeanFactory也会长一些。
你对Spring IOC的理解?
IoC(控制反转):这是一种面向对象编程的设计思想,在不采用这种思想的情况下,我们需要自己维护对象与对象之间的依赖关系,很容易造成对象之间的耦合度过高。IoC可以帮我们维护对象与对象之间的依赖关系,并由 IoC 容器完成对象的注入,降低对象之间的耦合度。IoC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,不用考虑对象是如何被创建出来的。
在具体的实现中,主要由三种注入方式:(1)构造方法注入:被注入对象可以在它的构造方法中声明依赖对象的参数列表,让外部知道它需要哪些依赖对象。然后,IoC Service Provider会检查被注入的对象的构造方法,取得它所需要的依赖对象列表,进而为其注入相应的对象。构造方法注入方式比较直观,对象被构造完成后,即进入就绪状态,可以马上使用。(2)setter方法注入:当前对象只要为其依赖对象所对应的属性添加setter方法,就可以通过setter方法将相应的依赖对象设置到被注入对象中。(3)接口注入:被注入对象如果想要IoC Service Provider为其注入依赖对象,就必须实现某个接口。这个接口提供一个方法,用来为其注入依赖对象。IoC Service Provider最终通过这些接口来了解应该为被注入对象注入什么依赖对象。
什么是Spring Bean?将一个类声明为Bean的注解有哪些?
被IOC容器管理的对象称为Bean。我们可以通过XML 文件、注解或者Java配置类的方式告诉 IoC容器帮助我们管理哪些对象。
@Component:通用的注解,可标注任意类为Spring组件。如果一个 Bean 不知道属于哪个层,可以使用@Component 注解标注。
@Repository:对应Dao持久层层,主要用于数据库相关操作。
@Service:对应服务层。
@Controller : 对应 Spring MVC 控制层,主要用于接受用户请求并调用Service 层返回数据给前端页面。
Spring是如何管理Bean的?
Spring通过IoC容器来管理Bean,我们可以通过XML配置或者注解配置,来指导IoC容器对Bean的管理。@Component、@Repository、@Service、@Controller用于声明Bean;@Autowired、@Qualifier和@Resource用于注入Bean。@AutoWired:根据Bean的类型自动注入;@Qualifier:根据Bean名称自动注入;@Resourse:根据Bean类型或Bean名称自动注入。
Bean的生命周期
Spring容器管理Bean,涉及对Bean的创建、初始化、调用、销毁等一系列的流程,这个流程就是Bean的生命周期。这个过程是由Spring容器自动管理。
Bean的作用域
singleton:IoC 容器中只有唯一的 bean 实例,Bean以单例的形式存在。
prototype:每次获取都会创建一个新的bean实例。
request:每一次HTTP 请求都会产生一个新的 bean,该bean仅在当前HTTP request内有效。
session :每一次来自新session的HTTP请求都会产生一个新的bean,该 bean 仅在当前HTTP session内有效。
application/global-session:每个Web 应用在启动时创建一个Bean,该bean仅在当前应用启动时间内有效。
单例Bean的线程安全问题
Spring容器本身并没有提供Bean的线程安全策略。如果单例的Bean是一个无状态的Bean,即线程中的操作不会对Bean的成员执行查询以外的操作,那么这个单例的Bean是线程安全的。比如,Controller、Service、DAO这样的组件,通常都是单例且线程安全的。
单例Bean存在线程问题,主要是因为当多个线程操作同一个对象的时候是存在资源竞争的。常见的有两种解决办法是:①在Bean 中尽量避免定义可变的成员变量;②在类中定义一个ThreadLocal 成员变量,将需要的可变成员变量保存在 ThreadLocal 中。
@Autowired和@Resource注解有什么区别?
@Autowired是Spring提供的注解,@Resource是JDK提供的注解。
@Autowired是只能按类型注入,@Resource默认按名称注入,也支持按类型注入。
你对Spring AOP的理解
AOP是面向切面编程,面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将程序抽象成各个切面。切面相当于应用对象间的横切点,我们可以将其单独抽象为单独的模块。这样便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。
Spring AOP支持如下两种实现方式:(1)JDK动态代理:这是Java提供的动态代理技术,可以在运行时创建接口的代理实例。Spring AOP默认采用这种方式,在接口的代理实例中织入代码。(2)CGLib动态代理:采用底层的字节码技术,在运行时创建子类代理的实例。当目标对象不存在接口时,Spring AOP就会采用这种方式,在子类实例中织入代码。
AOP的应用场景
Spring AOP为IoC的使用提供了更多的便利,一方面,应用可以直接使用AOP的功能,设计应用的横切关注点,把跨越应用程序多个模块的功能抽象出来,并通过简单的AOP的使用,灵活地编制到模块中,比如可以通过AOP实现应用程序中的日志功能。另一方面,在Spring内部,一些支持模块也是通过Spring AOP来实现的,比如事务处理。
AOP 的代理有哪几种方式?
(1)JDK动态代理:这是Java提供的动态代理技术,可以在运行时创建接口的代理实例。Spring AOP默认采用这种方式,在接口的代理实例中织入代码。
(2)CGLib动态代理:采用底层的字节码技术,在运行时创建子类代理的实例。当目标对象的实现类没有实现接口时,Spring AOP就会采用这种方式,在子类实例中织入代码。
AOP的术语
连接点:目标对象的所属类中,定义的所有方法均为连接点。
切入点:被切面拦截/ 增强的连接点。
通知:增强的逻辑/ 代码,即拦截到目标对象的连接点之后要做的事情。
目标对象:即被代理对象。
织入:它是一个通过动态代理技术,为原有服务对象生成代理对象,然后将与切点定义匹配的连接点拦截,并按约定将各类通知织入约定流程的过程。
切面:是一个可以定义切点、各类通知和引入的内容,SpringAOP将通过它的信息来增强Bean的功能或者将对应的方法织入流程。
Spring AOP和AspectJ AOP有什么区别?
Spring AOP属于运行时增强,而AspectJ是编译时增强。
Spring AOP基于代理,而AspectJ基于字节码操作。
Spring AOP已经集成了AspectJ,AspectJ 相比于 Spring AOP 功能更加强大,但是Spring AOP相对来说更简单,如果切面太多,最好选择AspectJ,它比Spring AOP快很多。
Spring如何管理事务?
编程式事务:Spring提供了TransactionTemplate模板,利用该模板我们可以通过编程的方式实现事务管理,而无需关注资源获取、复用、释放、事务同步及异常处理等操作。相对于声明式事务来说,这种方式相对麻烦一些,但是好在更为灵活,我们可以将事务管理的范围控制的更为精确。
声明式事务:它允许我们通过声明的方式,在IoC配置中指定事务的边界和事务属性,Spring会自动在指定的事务边界上应用事务属性。只需要在需要做事务管理的方法上,增加@Transactional注解,以声明事务特征即可。
Spring的事务如何配置,常用注解有哪些?
事务的打开、回滚和提交是由事务管理器来完成的,我们使用不同的数据库访问框架,就要使用与之对应的事务管理器。
使用@Transactional进行标注来声明式事务,这个注解可以标注在类或者方法上。当它标注在类上时,代表这个类所有公共非静态的方法都将启用事务功能。当它标注在方法上时,代表这个方法将启用事务功能。
Spring的事务传播方式有哪些?
Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时如何进行传播。
(1)PROPAGATION_REQUIRED:如果当前没有事务,则新建一个事务;如果已存在一个事务,则加入到这个事务中。
(2)PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,则以非事务方式执行。
(3)PROPAGATION_MANDATORY:使用当前的事务,如果当前没有事务,则抛出异常。
(4)PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,则把当前事务挂起。
(5)PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,则把当前事务挂起。
(6)PROPAGATION_NEVER:以非事务方式执行操作,如果当前存在事务,则抛出异常。
(7)PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作
Spring 事务中的隔离级别有哪几种?
(1)ISOLATION_DEFAULT:使用后端数据库默认的隔离级别,MySQL 默认采用的 REPEATABLE_READ 隔离级别,Oracle 默认采用的 READ_COMMITTED 隔离级别.
(2)ISOLATION_READ_UNCOMMITTED:最低的隔离级别,使用这个隔离级别很少,因为它允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读
(3)ISOLATION_READ_COMMITTED:允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
(4)ISOLATION_REPEATABLE_READ:对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
(5)ISOLATION_SERIALIZABLE:最高的隔离级别,完全服从ACID 的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。
说说对于Spring MVC的了解?
MVC是一种设计模式,在这种模式下软件被分为三层,即Model(模型)、View(视图)、Controller(控制器)。Model是程序的主体部分,主要包含业务数据和业务逻辑;View是程序呈现给用户的部分,是用户和程序交互的接口;Controller代表的是数据的处理逻辑,它是Model和View这两层的桥梁。将软件分层的好处是,可以将对象之间的耦合度降低,便于代码的维护。
Spring MVC的执行流程
(1)客户端(浏览器)发送请求,DispatcherServlet捕获请求。
(2)DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。HandlerMapping根据URI去匹配查找能处理的Handler(也就是我们平常说的 Controller 控制器)。
(3)DispatcherServlet根据获得的Handler,选择一个合适的HandlerAdapter。
(4)Handler完成对用户请求的处理后,会返回一个ModelAndView对象给DispatcherServlet,ModelAndView包含了数据模型以及相应的视图的信息。Model是返回的数据对象,View是个逻辑上的View。
(5)ViewResolver会根据逻辑视图查找实际的视图。
(6)当得到真实的视图对象View后,DispatcherServlet就使用这个View对象对ModelAndView中的模型数据进行视图渲染。
(7)将渲染结果返回给客户端。
Spring MVC的核心组件有哪些?
DispatcherServlet(前端控制器):统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理用户的请求。
HandlerMapping(处理器映射器):根据请求的url、method等信息查找Handler,即控制器方法。
HandlerAdapter(处理器适配器):根据HandlerMapping找到的Handler,适配执行对应的Handler;
Handler(处理器):,处理实际请求。
ViewResolver(视图解析器):根据Handler 返回的逻辑视图,解析并渲染真正的视图,并传递给 DispatcherServlet 响应客户端。
View(视图):将模型数据通过页面展示给用户。
Spring MVC注解
@RequestMapping:用于处理请求URL映射,将请求和处理请求的方法关联起来,建立映射关系。用于类上,则表示类中的所有响应请求的方法都是以该地址作为父路径;
@RequestBody:接收HTTP请求的json数据,将json转换为Java对象;
@ResponseBody:将Controller方法返回对象转化为json对象响应给客户。
@RequestParam:将形参名和请求参数创建映射关系。
Spring MVC的拦截器
SpringMVC中的拦截器用于拦截控制器方法的执行,拦截器需要实现HandlerInterceptor接口
SpringMVC中的拦截器有三个抽象方法:(1)preHandle:控制器方法执行之前执行preHandle(),其boolean类型的返回值表示是否拦截或放行,返回true为放行,即调用控制器方法;返回false表示拦截,即不调用控制器方法;(2)postHandle:控制器方法执行之后执行postHandle();(3)afterComplation:处理完视图和模型数据,渲染视图完毕之后执行afterComplation()。
SpringMVC的重定向和转发?
当控制器方法中所设置的视图名称以"redirect:"为前缀时,创建RedirectView视图,此时的视图名称不会被SpringMVC配置文件中所配置的视图解析器解析,而是会将前缀"redirect:"去掉,剩余部分作为最终路径通过重定向的方式实现跳转。
转发只需要使用“”即可。
说说你对Spring Boot的理解
从本质上来说,Spring Boot就是Spring,使用Spring Boot可以不用或者只需要很少的Spring配置。Spring Boot本身并不提供Spring的核心功能,而是作为Spring的脚手架框架,以达到快速构建项目、预置三方配置、开箱即用的目的。
SpringBoot有哪些优点?
(1)Spring Boot 而且内嵌了各种servlet容器,Tomcat等,现在不再需要打成war包部署到容器中,Spring Boot只要打成一个可执行的jar包就能独立运行,所有的依赖包都在一个jar包内。
(2)spring-boot-starter-web启动器自动依赖其他组件,简少了maven的配置。
(3)Spring Boot能根据当前类路径下的类、jar包来自动配置bean,如添加一个 spring-boot-starter-web启动器就能拥有web的功能,无需其他配置。
(4)避免大量的Maven导入和各种版本冲突。
Spring Boot的配置文件有哪几种格式?
.properties 和 .yml,它们的区别主要是书写格式不同。
Spring Boot Starter有什么用?
Spring Boot通过提供众多起步依赖(Starter)降低项目依赖的复杂度。起步依赖本质上是一个Maven项目对象模型,定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。
Spring Boot的启动流程
Spring Boot项目创建完成会默认生成一个名为 *Application 的入口类,我们是通过该类的main方法启动Spring Boot项目的。在main方法中,通过SpringApplication的静态方法,即run方法进行SpringApplication类的实例化操作,然后再针对实例化对象调用另外一个run方法来完成整个项目的初始化和启动。
Spring Boot项目是如何导入包的?
通过起步依赖Spring Boot Starter导入包。Spring Boot通过提供众多起步依赖(Starter)降低项目依赖的复杂度。起步依赖本质上是一个Maven项目对象模型,定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。
Spring Boot自动装配的过程
使用Spring Boot时,我们只需引入对应的Starters,Spring Boot启动时便会自动加载相关依赖,配置相应的初始化参数,以最快捷、简单的形式对第三方软件进行集成,这便是Spring Boot的自动配置功能。
整个自动装配的过程是:Spring Boot通过@EnableAutoConfiguration注解开启自动配置,加载各种AutoConfiguration类,当某个AutoConfiguration类满足其注解@Conditional指定的生效条件(Starters提供的依赖、配置或Spring容器中是否存在某个Bean等)时,实例化该AutoConfiguration类中定义的Bean(组件等),并注入Spring容器,就可以完成依赖框架的自动配置。
Spring Boot注解
@SpringBootApplication注解:它是Spring Boot项目的核心注解,可以看作是@Configuration、@EnableAutoConfiguration、@ComponentScan 注解的集合。@EnableAutoConfiguration启用 SpringBoot 的自动配置机制;@ComponentScan: 扫描被@Component 、@Repository、@Service、@Controller注解的 bean,注解默认会扫描该类所在的包下所有的类。@Configuration:允许在 Spring 上下文中注册额外的 bean 或导入其他配置类。
@Component,@Repository,@Service, @Controller:声明Bean;
@Autowired:自动注入Bean;
SpringBoot、Spring MVC和Spring有什么区别?
Spring:Spring最重要的特征是依赖注入。
Spring MVC:Spring MVC提供了一种分离式的方法来开发Web应用。
SpringBoot:通过一个自动配置和启动的项来解决Spring和Spring MVC需要配置大量的参数的问题。
SpringBoot 需要独立的容器运行吗?
可以不需要,内置了Tomcat等容器。
spring-boot-starter-parent 有什么用?
(1)继承自spring-boot-dependencies,这个里边定义了依赖的版本,也正是因为继承了这个依赖,所以我们在写依赖时才不需要写版本号。
(2)执行打包操作的配置。
(3)自动化的资源过滤。
SpringBoot 打成的jar和普通的jar有什么区别?
SpringBoot项目最终打包成的jar是可执行jar ,这种jar可以直接通过 java -jar xxx.jar 命令来运行,这种jar不可以作为普通的jar被其他项目依赖,即使依赖了也无法使用其中的类。
SpringBoot实现异常处理?
使用@ControllerAdvice + @ExceptionHandler 这两个注解的方式统一异常处理,
这种异常处理方式下,会给所有或者指定的Controller织入异常处理的逻辑(AOP),当 Controller中的方法抛出异常的时候,由被@ExceptionHandler 注解修饰的方法进行处理。
什么是yaml?
yaml是一种可读的数据序列化语言,它通常用于配置文件。与属性文件相比,如果我们想要在配置文件中添加复杂的属性,yaml文件就更加结构化,而且更少混淆。
SpringBoot核心配置文件是什么?
application.properties
谈谈你对MyBatis 的理解?
Mybatis内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建 Statement 等繁杂的过程。程序员直接编写原生态SQL,可以严格控制SQL执行性能,灵活度高。
MyBatis 可以使用XML或注解来配置和映射原生信息,将实体类映射成数据库中的记录,避免了手动设置参数以及获取结果集。
Dao 接口的工作原理是什么?Dao 接口里的方法,参数不同时,方法能重载吗?
通常一个Dao接口,都会写一个xml映射文件与之对应。Dao接口,即Mapper接口,接口的全类名就是映射文件中的namespace的值,接口的方法名就是映射文件中MappedStatement的id 值,接口方法内的参数就是传递给sql的参数。Mapper接口是没有实现类的,当调用接口方法时,接口全类名+方法名拼接字符串作为key值,可唯一定位一个MappedStatement。在 MyBatis 中,每一个 <select> 、 <insert> 、 <update> 、 <delete> 标签,都会被解析为一个 MappedStatement对象。
Dao 接口里的方法可以重载,但是Mybatis的xml里面的id不允许重复。
#{}和${}的区别是什么?
#{}是sql的参数占位符,MyBatis会将sql中的#{}替换为?号,在sql 执行前会按序给sql的?号占位符设置参数值。本质上是占位符赋值
使用$设置参数时,MyBatis只是创建普通的SQL语句,然后在执行SQL语句时MyBatis将参数直接拼入到SQL里。本质上是字符串拼接。
既然$不安全,为什么还需要$?
它可以解决一些特殊情况下的问题。例如,在一些动态表格(根据不同的条件产生不同的动态列)中,我们要传递SQL的列名,根据某些列进行排序,或者传递列名给SQL都是比较常见的场景,这就无法使用预编译的方式了。
MyBatis的xml文件和Mapper接口是怎么绑定的?
是通过xml文件中,<mapper> 根标签的namespace属性进行绑定的,即namespace属性的值需要配置成接口的全类名,MyBatis内部就会通过这个值将这个接口与这个xml关联起来。
xml映射文件中,除了常见的增删改查标签之外,还有哪些标签?
<resultMap> 、 <parameterMap> 、 <sql> 、 <include> 、 <selectKey> 等,其中 <sql> 为sql片段标签,通过 <include> 标签引入sql片段, <selectKey>为不支持自增的主键生成策略标签。
MyBatis 是如何进行分页的?分页插件的原理是什么?
MyBatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页;可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。
分页插件的基本原理是使用MyBatis 提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的 sql,然后重写sql,再添加对应的物理分页语句和物理分页参数。
MyBatis动态sql是做什么的?原理是什么?
MyBatis动态sql可以让我们在xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能。
执行原理为,从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql的功能。
MyBatis是如何将sql执行结果封装为目标对象并返回的?
(1)使用<resultMap> 标签,逐一定义列名和对象属性名之间的映射关系。
(2)使用sql列的别名功能,将列别名书写为对象属性名,MyBatis 会忽略列名大小写,智能找到与之对应对象属性名。
MyBatis能执行一对多、多对一的关联查询吗?怎么解决。
MyBatis可以执行一对一、一对多、多对一,多对多的关联查询。
解决一对多的查询:(1)使用resultMap自定义一个映射关系;(2)使用resultMap和association实现;(2)分步查询;
解决多对一的查询:(1)使用resultMap和collection实现;(2)分步查询
MyBatis的xml 映射文件中,不同的xml文件,id是否可以重复?
不同的xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复。
解决字段名和Bean中的属性名不同的问题
(1)给表的字段名起一个别名为与属性名;(2)使用resultMap自定义一个映射关系。
MyBatis缓存机制
一级缓存:一级缓存存在于SqlSession的生命周期中,即它是SqlSession级别的缓存,默认会启用。一级缓存默认开启,通过同一个SqlSession即可从缓存中获取数据。
使一级缓存失效的情况:①不同的SqlSession;②同一个SqlSession但是查询条件不同;③同一个SqlSession两次相同查询之间执行了一次增删改操作;④同一个SqlSession两次相同查询之间手动清空了缓存
二级缓存:二级缓存存在于SqlSessionFactory的生命周期中,即它是SqlSessionFactory级别的缓存。二级缓存需要手动打开,通过同一个SqlSessionFactory创建的SqlSession查询的结果会被缓存。二级缓存开启的条件:①查询的数据所转换的实体类类型必须实现序列化的接口;②在映射文件中设置标签<cache/>;③必须在SqlSession关闭或提交以后才有效;
使二级缓存失效的情况:两次相同查询之间执行了一次增删改操作,一级缓存和二级缓存都会失效。
查询顺序:先查询二级缓存再查询一级缓存再查询数据库
JavaEE三层架构
Web层:①接收客户端的请求;②调用Service层处理业务;③响应数据给客户端,请求转发,请求重定向。
Service业务层:①处理业务;②调用DAO持久层访问数据库。
Dao持久层:只负责跟数据库交互。
服务器内部转发和客户端重定向
内部转发(forward)是一次请求-响应的过程,服务器内部经过了多少次转发,客户端是不知道的,地址栏不变。
重定向(Redirect)是两次请求-响应的过程,客户端知道url的变化,地址栏会变化。
保存作用域
page保存作用域:是该页面范围内有效,只在JSP中使用
request保存作用域:是一次请求响应范围内有效,同一客户端的不同请求,无法获取保存作用域中的值
session保存作用域:是一次会话范围内有效,同一客户端在一次会话内的多个请求,都可以获取到session保存作用域内的值。
application保存作用域:是一次应用程序范围内有效,所有客户端的请求,都可以获取到application保存作用域中的值
session的工作原理
当客户端首次访问服务器时,服务器会为其创建一个session对象,该对象具有一个唯一标识SESSIONID。并且在响应阶段,服务器会创建一个cookie,并将SESSIONID存入其中。
客户端通过响应的cookie而持有SESSIONID,所以当它再次访问服务器时,会通过cookie携带这个SESSIONID。服务器获取到SESSIONID后,就可以找到与之对应的session对象,进而从这个session中获取该客户端的状态。
Cookie
①Cookie是服务器通知客户端保存键值对的一种技术;②客户端有了Cookie后,每次请求都把Cookie发送给服务器;③每个Cookie的大小不能超过4kb
Cookie的工作原理
浏览器端第一次发送请求到服务器端;服务器端创建Cookie,该Cookie中包含用户的信息,然后将该Cookie发送到浏览器端;浏览器端再次访问服务器端时会携带服务器端创建的Cookie;服务器端通过Cookie中携带的数据区分不同的用户。
Cookie和Session的区别
(1)cookie数据存放在客户端,session数据放在服务器上
(2)单个cookie在客户端的限制是不能超过4k,而session并没有上限。
(3)cookie只能保存ASCII字符串;session中能够存储任何类型的数据。
(4)cookie对客户端是可见的,是不安全的;session存储在服务器上,不存在敏感信息泄露的风险。
cookie和session各自适合的场景是什么?
对于敏感数据,应存放在session里,因为cookie不安全。
对于普通数据,优先考虑存放在cookie里,这样会减少对服务器资源的占用。
json
json是一种轻量级的数据交换格式,数据交换是指客户端和服务器之间数据的传递格式。json是由键值对组成,并且由大括号包围,每个键由引号引起来,键和值之间使用冒号分隔,键值对之间使用逗号分隔。
ajax
ajax是一种浏览器通过javascript异步发起请求,局部更新页面的技术。
get请求与post请求有什么区别?
(1)GET请求只能进行url编码,而POST支持多种编码方式。
(2)GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
(3)GET请求在URL中传送的参数是有长度限制的,而POST没有。
(4)GET没有POST安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
过滤器和拦截器的区别?
Filter过滤器主要用于过滤请求,对请求的参数、属性进行调整;拦截器主要用于拦截对Controller的请求;
过滤器基于函数回调,拦截器基于Java反射机制;
过滤器依赖Servlet容器,拦截器不依赖Servlet容器 ;
过滤器几乎对所有请求起作用;
过滤器只能在容器初始化时被调用一次,拦截器可以多次被调用;
相关文章:
Spring+SpringMVC+SpringBoot+MyBatis面试题
什么是Spring框架?使用Spring框架的好处是什么?Spring是一款开源的轻量级Java开发框架,可以提高开发人员的开发效率以及系统的可维护性。Spring框架是很多模块的集合,使用这些模块可以很方便地协助我们进行开发,比如说…...

ContextCapture Master 倾斜摄影测量实景三维建模技术
ContextCapture实景建模大师是一套无需人工干预,通过影像自动生成高分辨率的三维模型的软件解决方案。它集合了全球最先进数字影像处理、计算机虚拟现实以及计算机几何图形算法,在易用性、数据兼容性、运算性能、友好的人机交互及自由的硬件配置兼容性等…...

MySQL事务
文章目录MySQL事务事务的四个特性 ACID事务提交的类型事务的使用MySQL事务 事务是什么? 事务就是一组逻辑操作单元,是数据从一种状态变成另外一种状态。整个单元有一个或多个SQL语句构成,在这个操作单元中,每一个SQL语句相互依赖…...

CData Drivers for Acumatica
CData Drivers for Acumatica Acumatica的CData驱动程序为用户提供了使用AcumaticaERP数据的便捷途径,该数据来自商业智能、分析、定制应用程序、报告以及ETL。通过JDBC、ADO.NET和ODBC等标准驱动程序,以及与PowerShell、Power BI、Excel、SSIS等流行应用…...

智慧税务+数据可视化:企业财务管理告别难题
一、引言在发展社会主义市场经济的过程中,税收承担着组织财政收入、调控经济、调节社会分配的职能。中国每年财政收入的90%以上来自税收,其地位和作用越来越重要,可称之为国家经济的“晴雨表”,有效进行税务管理、充分挖掘税务大数…...

Ansible中常用的模块
目录 一、Ansible Ad-Hoc命令集 1 Ad-hoc 使用场景 2 Ansible的并发特性 3 Ansible-doc用法 4 ansible命令运行方式及常用参数 5 ansible的基本颜色代表 6 ansible中的常用模块 command模块 shell模块 script模块 copy模块 fetch模块 unarchive模块 archive模块…...
问:你是如何进行react状态管理方案选择的?
前言:最近接触到一种新的(对我个人而言)状态管理方式,它没有采用现有的开源库,如redux、mobx等,也没有使用传统的useContext,而是用useState useEffect写了一个发布订阅者模式进行状态管理&…...
【华为OD机试真题 java、python、jsNode】任务总执行时长【2022 Q4 100分】
代码请进行一定修改后使用,本代码保证100%通过率,本题提供了 java、python、JsNode三种代码 题目描述 任务编排服务负责对任务进行组合调度。参与编排的任务有两种类型,其中一种执行时长为taskA,另一种执行时长为taskB。任务一旦开始执行不能被打断,且任务可连续执行。服…...
react基础
react组件传参 父传子 父组件 < ChildA value{this.state.num}></ChildA> 子组件 {props.value}接收父组件传入参数 ChildA.defaultProps{vaue:1} defaultProps默认参数 子传父 props回调函数形式 父 setNum>v>this.setState({num:v}) v形参 < ChildA…...

【Spark分布式内存计算框架——Spark SQL】2. SparkSQL 概述(上)
第二章 SparkSQL 概述 Spark SQL允许开发人员直接处理RDD,同时可以查询在Hive上存储的外部数据。Spark SQL的一个重要特点就是能够统一处理关系表和RDD,使得开发人员可以轻松的使用SQL命令进行外部查询,同时进行更加复杂的数据分析。 2.1 前…...

Kubeadm搭建K8S
目录 一、部署步骤 1、实验环境 2、环境准备 3、所有节点安装Docker 4、 所有节点配置K8S源 5、所有节点安装kubeadm,kubelet和kubectl 6、部署 kubernetes Master 节点 7、token制作 8、k8s-node节点加入master节点 9、 master节点安装部署pod网络插件&a…...
【技术分享】搭建java项目引入外部依赖教程
文章目录引言如何在linux中编译运行java程序IDEA中新建一个简单的java工程项目并运行IDEA中如何引入外部依赖并运行maven引入log4j jar包手工引入log4j jar包如何使用命令行的方式添加外部依赖如何新建一个spring源码项目并为其添加依赖给定一个spring工程源码,如何…...

算法 ——世界 二
个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。个人爱好: 编程,打篮球,计算机知识个人名言:海不辞水,故能成其大;山不辞石…...
数据治理CDGP选择题 4
5、根据DMBOK2,在实施数据治理时,要注重数据标准的建设,以下关于数据标准的描述,哪个选项是不正确的? (知识点: CDGP仿真题)A.数据标准必须得到有效沟通、监控,并被定期审查和更新;最重要的是,必须有强制手…...

动态规划之01背包问题和完全背包问题
01背包的问题描述:(内容参考代码随想录)有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。问题示例&#…...
MATLAB算法实战应用案例精讲-【图像处理】数字图像灰度化(附Java、python、matlab和opencv代码实现)
目录 前言 几个相关概念 1、RGB 2、ARGB 3、灰度化 4.图像点运算 5.线性点运算...
Linux(强大的yum命令)
yum 读 [jʌm] ,中文谐音: 样安ing。 yum( Yellow dog Updater, Modified)是一个在 Fedora 和 RedHat 以及 SUSE 中的 Shell 前端软件包管理器。 基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并且安装&#x…...
28.结语
文章目录28 Epilogue 结语28 Epilogue 结语 Don’t let it end like this. Tell them I said something. 不要让它就这样结束。 告诉他们我说了些什么 —Pancho Villa 您已到达旅程的尽头。 辛苦了 我们希望您能从本书中找到一些有价值的收获。 我们建议该列表应包括以下内…...
ICRS、GCRS、CIRS、TIRS和ITRS坐标系统简介
ICRS、GCRS、CIRS、TIRS和ITRS坐标系统简介1. 简介2. ICRS、GCRS、CIRS、TIRS和ITRS分别介绍2.1 ICRS详细说明2.2 GCRS详细说明2.3 CIRS详细说明2.4 TIRS详细说明2.5 ITRS 详细说明1. 简介 ICRS、GCRS、CIRS、TIRS和ITRS都是天文学中使用的坐标系统: ICRS (Intern…...

你是真的“C”——详解结构体知识点
你是真的“C”——详解结构体知识点😎前言🙌什么是结构体?🙌1. 结构体的声明🙌1.1 结构的基础知识1.2 结构的声明1.3 结构成员的类型1.4 结构体变量的定义和初始化2. 结构体成员的访问🙌3结构体传参&#x…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...

从零开始了解数据采集(二十八)——制造业数字孪生
近年来,我国的工业领域正经历一场前所未有的数字化变革,从“双碳目标”到工业互联网平台的推广,国家政策和市场需求共同推动了制造业的升级。在这场变革中,数字孪生技术成为备受关注的关键工具,它不仅让企业“看见”设…...

门静脉高压——表现
一、门静脉高压表现 00:01 1. 门静脉构成 00:13 组成结构:由肠系膜上静脉和脾静脉汇合构成,是肝脏血液供应的主要来源。淤血后果:门静脉淤血会同时导致脾静脉和肠系膜上静脉淤血,引发后续系列症状。 2. 脾大和脾功能亢进 00:46 …...
6.计算机网络核心知识点精要手册
计算机网络核心知识点精要手册 1.协议基础篇 网络协议三要素 语法:数据与控制信息的结构或格式,如同语言中的语法规则语义:控制信息的具体含义和响应方式,规定通信双方"说什么"同步:事件执行的顺序与时序…...