专业网站建设公司用织梦吗?,公众号的维护与运营,网站文章采集工具,建立wordpress用哪个云好Spring、MyBatis、SpringMVC 框架 - 面试宝典 又到了 金三银四、金九银十 的时候了#xff0c;是时候收藏一波面试题了#xff0c;面试题可以不学#xff0c;但不能没有#xff01;#x1f941;#x1f941;#x1f941; 一个合格的 计算机打工人 #xff0c;收藏夹里…Spring、MyBatis、SpringMVC 框架 - 面试宝典 又到了 金三银四、金九银十 的时候了是时候收藏一波面试题了面试题可以不学但不能没有 一个合格的 计算机打工人 收藏夹里必须有一份 SSM 框架 八股文 面试题 特别是即将找工作的计算机人希望本篇博客对你有帮助 祝各位计算机人都可以在就业季里顺利通过面试找到 钱多事少离家近 的满意工作 面试题系列 博客导航 JavaSE 八股文 面试宝典 MySQL 八股文 面试宝典 Spring、MyBatis、SpringMVC 八股文 面试宝典 ⇦当前位置 SpringBoot框架 八股文 面试宝典 未完待续 ... 如果有一天你 厌倦上班、厌倦996 想要 考研备考 的话408 全套初复试笔记汇总 传送门 后续随着自己的学习也会陆续补充新的面试题如果对大家起到帮助的话求赞 、求收藏 、求关注 1.1 Spring基本概念
01. 简述Spring框架以及主要模块 Spring是一个轻量级的控制反转和面向切面的开源容器框架 Spring有七大功能模块 1.Core Core模块是Spring的核心类库Core实现了IOC功能 2.AOP Spring AOP模块是Spring的AOP库提供了AOP拦截器机制并提供了常见的拦截器供用户自定义和配置 3.ORM 提供对常用ORM框架的管理和支持Hibernate、MyBatis等 4.Dao Spring提供对JDBC的支持对JDBC进行封装 5.WEB 对Struts2的支持 6.Context Context模块提供框架式的Bean的访问方式其他程序可以通过Conetext访问Spring的Bean资源相当于资源注入 7.MVC MVC模块为Spring提供了一套轻量级的MVC实现即Spring MVC 02. 使用Spring框架优点 1.轻量级框架、容器 Spring是一个容器管理对象的生命周期和配置。 基于一个可配置原型prototype你的bean可以是单例的也可以每次需要时都生成一个新的实例。 2.控制反转IOC Spring的IOC减低了业务对象替换的复杂度提高了组件之间的解耦。 3.支持AOP Spring提供对AOP的支持它运行将一些通用任务如安全、事务、日志等进行集中处理从而提高程序的复用性。 4.方便测试 提供了JUnit4的支持可以通过注解方便测试spring程序 5.集成了各种优秀框架和庞大生态圈 6.支持声明式事务处理 只需要通过配置就可以完成对事务的管理 03. 简述控制反转(IOC)、依赖注入 借助Spring实现具有依赖关系的对象之间的解耦 对象A运行需要对象B有主动创建变为IOC容器注入这便是控制反转。 控制什么在实现过程中所需要的对象及需要依赖的对象。 什么是反转在没有IOC容器之前我们都是在对象中主动去创建依赖的对象这是正转的 而有了IOC之后依赖的对象直接由IOC容器创建后注入到对象中由主动创建变成了被动接受这是反转。 获得依赖对象的过程被反转了获取依赖对象的过程 由自身创建变为由IOC容器注入这便是依赖注入。 04. 简述下AOP AOP全称叫做 Aspect Oriented Programming 面向切面编程。它是为解耦而生的解耦是程序员编码开发过程中一直追求的境界AOP在业务类的隔离上绝对是做到了解耦在这里面有几个核心的概念 切面Aspect: 指关注点模块化这个关注点可能会横切多个对象。事务管理是企业级Java应用中有关横切关注点的例子。 在Spring AOP中切面可以使用通用类基于模式的方式schemabasedapproach或者在普通类中以Aspect 注解AspectJ 注解方式来实现。 连接点Join point: 在程序执行过程中某个特定的点例如某个方法调用的时间点或者处理异常的时间点。在Spring AOP中一个连接点总是代表一个方法的执行。 通知Advice: 在切面的某个特定的连接点上执行的动作。通知有多种类型包括“around”,“before” and “after”等等。通知的类型将在后面的章节进行讨论。 许多AOP框架包括Spring在内都是以拦截器做通知模型的并维护着一个以连接点为中心的拦截器链。 切点Pointcut: 匹配连接点的断言。通知和切点表达式相关联并在满足这个切点的连接点上运行例如当执行某个特定名称的方法时。切点表达式如何和连接点匹配是AOP的核心Spring默认使用AspectJ切点语义。 引入Introduction: 声明额外的方法或者某个类型的字段。Spring允许引入新的接口以及一个对应的实现到任何被通知的对象上。例如可以使用引入来使bean实现 IsModified 接口 以便简化缓存机制在AspectJ社区引入也被称为内部类型声明inter。 目标对象Target object: 被一个或者多个切面所通知的对象。也被称作被通知advised对象。既然Spring AOP是通过运行时代理实现的那么这个对象永远是一个被代理proxied的对象。 AOP代理AOP proxy:AOP框架创建的对象用来实现切面契约aspect contract包括通知方法执行等功能。在Spring中AOP代理可以是JDK动态代理或CGLIB代理。 织入Weaving: 把切面连接到其它的应用程序类型或者对象上并创建一个被被通知的对象的过程。这个过程可以在编译时例如使用AspectJ编译器、类加载时或运行时中完成。 Spring和其他纯Java AOP框架一样是在运行时完成织入的。 大白话 任何一个系统都是由不同的组件组成的每个组件负责一块特定的功能当然会存在很多组件是跟业务无关的例如日志、事务、权限等核心服务组件这些核心服务组件经常融入到具体的业务逻辑中如果我们为每一个具体业务逻辑操作都添加这样的代码很明显代码冗余太多因此我们需要将这些公共的代码逻辑抽象出来变成一个切面然后注入到目标对象具体业务中去AOP正是基于这样的一个思路实现的通过动态代理的方式将需要注入切面的对象进行代理在进行调用的时候将公共的逻辑直接添加进去而不需要修改原有业务的逻辑代码只需要在原来的业务逻辑基础之上做一些增强功能即可。 05. 简述如何实现一个IOC容器 06. Spring是如何简化开发的 基于POJO的轻量级和最小侵入性编程基于依赖注入和面向接口实现松耦合基于切面和惯例进行声明式编程基于切面和模板减少样板式代码 07. 简述JavaConfig JavaConfig是Spring3.0新增的概念就是以注解的形式取代Spring中繁琐的xml文件。 JavaConfig结合了xml的解耦和java编译时检查的优点。 Configuration表示这个类是配置类 ComponentScan相当于xml的context:componentScan basepackage Bean相当于xml的 bean id“student” class“com.guor.entity” EnableWebMvc相当于xml的 mvc:annotation-driven ImportResource相当于xml的 import resource“application-context-cache.xml” PropertySource用于读取properties配置文件 Profile一般用于多环境配置激活时可用ActiveProfile(“dev”)注解 09. 简述Spring的配置方式 1.XML配置文件 2.基于注解的方式 项目越来越大基于xml配置太麻烦Spring 2.x时代提供了声明bean的注解。 1Bean的定义 // Component、Controller、Service、Repository2Bean的注入 // Autowire3、基于Java的方式关键 Spring 3.x以后可以通过Java代码装配Bean。 1.2 Spring框架原理
01. 简述BeanFactory和ApplicationContext区别 Spring提供了两种不同的IOC容器BeanFactory和ApplicationContext都是接口 1.BeanFactory是Spring的最底层接口包含bean的定义、管理bean的加载、实例化控制bean的生命周期特点是每次获取对 象时才创建对象。 2.ApplicationContext是BeanFactory的子接口拥有BeanfFactory的全部功能并且扩展了很多高级特性每次容器启动时就创 建所有对象。 ApplicationContext ApplicationContext的额外功能继承MessageSource支持国际化统一的资源文件访问方式提供在监听器中注册bean同时加载过个配置文件载入多个有继承关系上下文使得每个上下文都专注于一个特定的层次比如应用的web层 BeanFactory 和 ApplicationContext都支持BeanPostProcessorBeanFactoryPostProcessor 但BeanFactory需要手动注册ApplicationContext则是自动注册。 02. 简述Spring Bean的生命周期 1、解析类得到BeanDefinition 2、如果有多个构造方法则要推断构造方法 3、确定好构造方法后进行实例化得到一个对象 4、对对象中的加了Autowired注解的属性进行属性填充 5、回调Aware方法比如BeanNameAwareBeanFactoryAware 6、调用BeanPostProcessor的初始化前的方法 7、调用初始化方法 8、调用BeanPostProcessor的初始化后的方法在这里会进行AOP 9、如果当前创建的bean是单例的则会把bean放入单例池 10、使用bean 11、Spring容器关闭时调用DisposableBean中destory()方法 03. 简述Spring支持的bean作用域 ① singleton 单例模式 使用该属性定义Bean时这种bean范围是默认的这种范围确保不管接受多少请求每个IOC容器中只有一个bean的实例 ② prototype 使用该属性定义Bean时IOC容器可以创建多个Bean实例为每一个bean提供一个实例 ③ request 使用该属性定义Bean时在请求bean范围内为每一个来自客户端的网络请求创建一个实例适用于WebApplicationContext环 境。在请求完毕后bean会失效并被垃圾回收器回收 ④ session 为每个session创建一个实例session过期后bean会随之消失 ⑤ global-session 所有的Session共享一个Bean实例 global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时它包含很多portlet。 如果你想要声明让所有的portlet公用全局的存储变量的话那么全局变量需要存储在global-session中。 ⑥ application bean被定义为在ServletContext的生命周期中复用一个单例对象。 04. 简述单例Bean是否线程安全 Spring中的Bean对象默认是单例的框架并没有对bean进行多线程的封装处理。 如果Bean是有状态的那么就需要开发人员自己来保证线程安全的保证最简单的办法就是改变bean的作用域把singleton改成 prototype这样每次请求bean对象就相当于是创建新的对象来保证线程的安全。 有状态就是有数据存储的功能无状态就是不会存储数据。 我们的controllerservice和dao本身并不是线程安全的只是调用里面的方法而且多线程调用一个实例的方法会在内存中复 制遍历这是自己线程的工作内存是最安全的。 因此在进行使用的时候不要在bean中声明任何有状态的实例变量或者类变量如果必须如此也推荐大家使用ThreadLocal把 变量变成线程私有如果bean的实例变量或者类变量需要在多个线程之间共享那么就只能使用synchronizedlockcas等这些 实现线程同步的方法了。 05. 简述Bean的自动装配 Spring支持IOC自动装配不用类实例化直接从bean容器中取。 1、配置在xml中 bean idemployeeDAO classcom.guor.EmployeeDAOImpl autowirebyName /2、Autowired自动装配可以在字段、setter方法、构造函数上使用。 bean的自动装配指的是bean的属性值在进行注入的时候通过某种特定的规则和方式去容器中查找并设置到具体的对象属性中主要有五种方式 no – 缺省情况下自动配置是通过“ref”属性手动设定在项目中最常用 byName – 根据属性名称自动装配。如果一个bean的名称和其他bean属性的名称是一样的将会自装配它。 byType – 按数据类型自动装配如果bean的数据类型是用其它bean属性的数据类型兼容并自动装配它。 constructor – 在构造函数参数的byType方式。 autodetect – 如果找到默认的构造函数使用“自动装配用构造”; 否则使用“按类型自动装配”。 15. Spring框架中使用了哪些设计模式及应用场景
① 简单工厂模式 ⭐ 简单工厂模式的本质就是一个工厂类根据传入的参数动态的决定实例化哪个类。 Spring的BeanFactory就是简单工厂模式的体现根据传入一个唯一标识来获得bean对象。但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。 ② 工厂方法模式 ⭐ 实现了FactoryBean接口的bean是一类叫做factory的bean。 其特点是spring会在使用getBean()调用获得该bean时会自动调用该bean的getObject()方法所以返回的不是factory这个bean而是这个bean.getOjbect()方法的返回值。 ③ 单例模式 ⭐ 保证一个类仅有一个实例并提供一个访问它的全局访问点 spring对单例的实现 spring中的单例模式完成了后半句话即提供了全局的访问点BeanFactory。但没有从构造器级别去控制单例这是因为spring管理的是任意的java对象。 ④ 代理模式 Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术 ⑤ 装饰器模式 动态地给一个对象添加一些额外的职责。就增加功能来说Decorator模式相比生成子类更为灵活。 Spring中用到的包装器模式在类名上有两种表现一种是类名中含有Wrapper另一种是类名中含有Decorator ⑥ 观察者模式 spring的事件驱动模型使用的是 观察者模式 Spring中Observer模式常用的地方是listener的实现。 ⑦ 适配器模式 Spring定义了一个适配接口使得每一种Controller有一种对应的适配器实现类让适配器代替controller执行相应的方法。这样在扩展Controller时只需要增加一个适配器类就完成了SpringMVC的扩展了 ⑧ 策略模式 ⭐ 加载资源文件的方式使用了不同的方法比如ClassPathResoureceFileSystemResourceServletContextResourceUrlResource但他们都有共同的借口Resource 在Aop的实现中采用了两种不同的方式JDK动态代理和CGLIB代理 Spring框架的资源访问Resource接口。该接口提供了更强的资源访问能力Spring 框架本身大量使用了Resource 接口来访问底层资源。 ⑨ 动态代理 切面在应用运行的时刻被织入。一般情况下在织入切面时AOP容器会为目标对象创建动态的创建一个代理对象。 SpringAOP就是以这种方式织入切面的。 织入把切面应用到目标对象并创建新的代理对象的过程。 16. 简述Spring事务的实现方式原理 在使用Spring框架的时候可以有两种事务的实现方式一种是编程式事务有用户自己通过代码来控制事务的处理逻辑还有一种是声明式事务通过Transactional注解来实现。 其实事务的操作本来应该是由数据库来进行控制但是为了方便用户进行业务逻辑的操作spring对事务功能进行了扩展实现一般我们很少会用编程式事务更多的是通过添加Transactional注解来进行实现当添加此注解之后事务的自动功能就会关闭有spring框架来帮助进行控制。 其实事务操作是AOP的一个核心体现当一个方法添加Transactional注解之后spring会基于这个类生成一个代理对象会将这个代理对象作为bean当使用这个代理对象的方法的时候如果有事务处理那么会先把事务的自动提交给关系然后去执行具体的业务逻辑如果执行逻辑没有出现异常那么代理逻辑就会直接提交如果出现任何异常情况那么直接进行回滚操作当然用户可以控制对哪些异常进行回滚操作。 TransactionInterceptor 17. 简述Spring事务的隔离级别 spring中的事务隔离级别就是数据库的隔离级别有以下几种 read uncommitted未提交读 read committed提交读、不可重复读 repeatable read可重复读 serializable可串行化 数据库的配置隔离级别是Read Commited,而Spring配置的隔离级别是Repeatable Read请问这时隔离级别是以哪一个为准 答以Spring配置的为准如果spring设置的隔离级别数据库不支持效果取决于数据库 18. 简述Spring事务的传播机制 多个事务方法相互调用时事务如何在这些方法之间进行传播,spring中提供了7中不同的传播特性来保证事务的正常执行 REQUIRED默认的传播特性如果当前没有事务则新建一个事务如果当前存在事务则加入这个事务 SUPPORTS当前存在事务则加入当前事务如果当前没有事务则以非事务的方式执行 MANDATORY当前存在事务则加入当前事务如果当前事务不存在则抛出异常 REQUIRED_NEW创建一个新事务如果存在当前事务则挂起改事务 NOT_SUPPORTED以非事务方式执行如果存在当前事务则挂起当前事务 NEVER不使用事务如果当前事务存在则抛出异常 NESTED如果当前事务存在则在嵌套事务中执行否则REQUIRED的操作一样 NESTED和REQUIRED_NEW的区别 REQUIRED_NEW是新建一个事务并且新开始的这个事务与原有事务无关而NESTED则是当前存在事务时会开启一个嵌套事务在NESTED情况下父事务回滚时子事务也会回滚而REQUIRED_NEW情况下原有事务回滚不会影响新开启的事务 NESTED和REQUIRED的区别 REQUIRED情况下调用方存在事务时则被调用方和调用方使用同一个事务那么被调用方出现异常时由于共用一个事务所以无论是否catch异常事务都会回滚而在NESTED情况下被调用方发生异常时调用方可以catch其异常这样只有子事务回滚父事务不会回滚。 19. Spring事务什么时候会失效 spring事务的原理是AOP进行了切面增强那么失效的根本原因是这个AOP不起作用了常见情况 1、bean对象没有被spring容器管理 2、方法的访问修饰符不是public Transactional 只能用于 public 的方法上否则事务不会失效如果要用在非 public 方法上可以开启 AspectJ 代理模式。 3、自身调用问题类里面使用this调用本类的方法this通常省略此时这个this对象不是代理类而是UserService对象本身 解决方法很简单让那个this变成UserService的代理类即可 4、数据源没有配置事务管理器 5、数据库不支持事务 6、异常被捕获事务不会回滚(或者抛出的异常没有被定义默认为RuntimeException) 7、异常类型错误或者配置错误 2.1 MyBatis的基本概念
01. 简述ORM框架 ORMObject-relational mapping对象关系映射 是为了解决面向对象与关系型数据库存在的不匹配问题。 ORM框架的优点 1.开发效率高 2.数据访问更抽象、轻便 3.支持面向对象封装 02. 简述MyBatis 03. 简述mybatis的优缺点
1、Mybait的优点 1简单易学容易上手相比于Hibernate 基于SQL编程 2JDBC相比减少了50%以上的代码量消除了JDBC大量冗余的代码不需要手动开关连接 3很好的与各种数据库兼容因为MyBatis使用JDBC来连接数据库所以只要JDBC支持的数据库MyBatis都支持而JDBC提供了可扩展性所以只要这个数据库有针对Java的jar包就可以就可以与MyBatis兼容开发人员不需要考虑数据库的差异性。 4提供了很多第三方插件分页插件 / 逆向工程 5能够与Spring很好的集成 6MyBatis相当灵活不会对应用程序或者数据库的现有设计强加任何影响SQL写在XML里从程序代码中彻底分离解除 sql与程序代码的耦合便于统一管理和优化并可重用。 7提供XML标签支持编写动态SQL语句。 8提供映射标签支持对象与数据库的ORM字段关系映射。 9提供对象关系映射标签支持对象关系组建维护。 2、MyBatis框架的缺点 1SQL语句的编写工作量较大尤其是字段多、关联表多时更是如此对开发人员编写SQL语句的功底有一定要求。 2SQL语句依赖于数据库导致数据库移植性差不能随意更换数据库。 04. 简述mybatis和hibernate的区别
Hibernate的优点 1、hibernate是全自动hibernate完全可以通过对象关系模型实现对数据库的操作拥有完整的JavaBean对象与数据库的映射结构来自动生成sql。 2、功能强大数据库无关性好O/R映射能力强需要写的代码很少开发速度很快。 3、有更好的二级缓存机制可以使用第三方缓存。 4、数据库移植性良好。 5、hibernate拥有完整的日志系统hibernate日志系统非常健全涉及广泛包括sql记录、关系异常、优化警告、缓存提示、脏数据警告等 Hibernate的缺点 1、学习门槛高精通门槛更高程序员如何设计O/R映射在性能和对象模型之间如何取得平衡以及怎样用好Hibernate方面需要的经验和能力都很强才行 2、hibernate的sql很多都是自动生成的无法直接维护sql虽然有hql查询但功能还是不及sql强大见到报表等变态需求时hql查询要虚也就是说hql查询是有局限的hibernate虽然也支持原生sql查询但开发模式上却与orm不同需要转换思维因此使用上有些不方便。总之写sql的灵活度上hibernate不及mybatis。 Mybatis的优点 1、易于上手和掌握提供了数据库查询的自动对象绑定功能而且延续了很好的SQL使用经验对于没有那么高的对象模型要求的项目来说相当完美。 2、sql写在xml里便于统一管理和优化 解除sql与程序代码的耦合。 3、提供映射标签支持对象与数据库的orm字段关系映射 4、 提供对象关系映射标签支持对象关系组建维护 5、提供xml标签支持编写动态sql。 6、速度相对于Hibernate的速度较快 Mybatis的缺点 1、关联表多时字段多的时候sql工作量很大。 2、sql依赖于数据库导致数据库移植性差。 3、由于xml里标签id必须唯一导致DAO中方法不支持方法重载。 4、对象关系映射标签和字段映射标签仅仅是对映射关系的描述具体实现仍然依赖于sql。 5、DAO层过于简单对象组装的工作量较大。 6、不支持级联更新、级联删除。 7、Mybatis的日志除了基本记录功能外其它功能薄弱很多。 8、编写动态sql时,不方便调试尤其逻辑复杂时。 9、提供的写动态sql的xml标签功能简单编写动态sql仍然受限且可读性低。 05. mybatis中#{}和${}的区别是什么 a、#{}是预编译处理$ {}是字符串替换。 b、Mybatis 在处理#{}时会将 sql 中的#{}替换为?号调用 PreparedStatement 的 set 方法来赋值 c、Mybatis 在处理$ {}时就是把{}里替换成变量的值。 d、使用#{}可以有效的防止 SQL 注入提高系统安全性 2.2 MyBatis框架原理
01. 简述一下mybatis插件运行原理 mybatis只支持针对ParameterHandler、ResultSetHandler、StatementHandler、Executor这四种接口的插件mybatis使用jdk的动态代理为需要拦截的接口生成代理对象以实现接口方法拦截功能每当执行这四种接口对象的方法时就会进入拦截方法具体就是InvocationHandler的invoke方法拦截那些你指定需要拦截的方法。 编写插件实现Mybatis的Interceptor接口并复写intercept方法啊然后给插件编写注解指定要拦截哪一个接口的哪些方法在配置文件中配置编写的插件即可。 Intercepts({Signature(type StatementHandler.class,method parameterize,args Statement.class)})02. 属性名和字段名不一致该怎么办 第1种通过在查询的sql语句中定义字段名的别名让字段名的别名和实体类的属性名一致。 select id”selectorder” parametertype”int”
resultetype”me.gacl.domain.order”select order_id id, order_no orderno ,order_price price form orders where
order_id#{id};/select 第2种通过来映射字段名和实体类属性名的——对应的关系。 select idgetOrder parameterTypeint resultMaporderresultmapselect * from orders where order_id#{id}/selectresultMap type”me.gacl.domain.order” id”orderresultmap”!–用id属性来映射主键字段–id property”id” column”order_id”!–用result属性来映射非主键字段property为实体类属性名column为数据表中的属性–result property “orderno” column ”order_no”/result property”price” column”order_price” //reslutMap03. 简述sql执行结果封装为目标对象并返回的映射关系 第—种是使用标签逐一定义数据库列名和对象属性名之间的映射关系。 第二种是使用sql列的别名功能将列的别名书写为对象属性名。 有了列名与属性名的映射关系后Mybatis通过反射创建对象同时使用反射给对象的属性逐一赋值并返回那些找不到映射关系的属性是无法完成赋值的。 04. 简述Mybatis如何分页、分页插件的原理 Mybatis使用RowBounds对象进行分页它是针对Resultset结果集执行的内存分页而非物理分页。可以在sql内直接书 写带有物理分页的参数来完成物理分页功能也可以使用分页插件来完成物理分页。 分页插件的基本原理是使用Mybatis提供的插件接口实现自定义插件在插件的拦截方法内拦截待执行的sql然后重写sql根据dialect方言添加对应的物理分页语句和物理分页参数。 05. 简述如何执行批量插入 首先创建—个简单的insert语句 insert id”insertname”insert into names (name) values (#{value})/insert Java代码批次处理插入 liststring names new arraylist();names.add(“fred”);names.add(“barney”);names.add(“betty”);names.add(“wilma”);// 注意这里 executortype.batchsqlsession 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();}06. 简述MyBatis实现一对一的方式 有联合查询和嵌套查询 联合查询是几个表联合查询只查询一次通过在resultMap里面配置association节点配置一对一的类就可以完成嵌套查询是先查一个表根据这个表里面的结果的外键id去再另外一个表里面查询数据也是通过association配置但另外一个表的查询通过select属性配置。 07. 简述Mybatis的延迟加载以及实现原理 Mybatis仅支持association关联对象和collection关联集合对象的延迟加载 association指的就是一对一collection指的就是一对多查询。 在Mybatis配置文件中可以配置是否启用延迟加载lazyLoadingEnabledtrue|false。 它的原理是使用CGLIB创建目标对象的代理对象当调用目标方法时进入拦截器方法 比如调用a.getB().getName()拦截器invoke()方法发现a.getB()是null值那么就会单独发送事先保存好的查询关联B对象的sql把B查询上来然后调用a.setB(b)于是a的对象b属性就有值了接着完成a.getB( ) .getName()方法的调用。这就是延迟加载的基本原理。 当然了不光是Mybatis几乎所有的包括Hibernate支持延迟加载的原理都是一样的 08. Mybatis的一级、二级缓存 1) 一级缓存:基于PerpetualCache的 HashMap本地缓存其存储作用域为Session当Session flush或close 之后该Session中的所有Cache就将清空默认打开—级缓存。 2) 二级缓存与一级缓存其机制相同默认也是采用PerpetualcacheHashMap存储不同在于其存储作用域为 Napper(Namespace)并且可自定义存储源如Ehcache。默认不打开二级缓存要开启二级缓存使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置; 3) 对于缓存数据更新机制当某一个作用域(一级缓存Sessionl二级缓存Namespaces)的进行了CIU/D操作后默认该作用域下所有select 中的缓存将被clear掉并重新更新如果开启了二级缓存则只根据配置判断是否刷新 3.1 SpringMVC
01. 简述springmvc工作流程 02. 简述springmvc的九大组件有哪些 1.HandlerMapping 根据request找到相应的处理器。因为HandlerController有两种形式一种是基于类的Handler 另一种是基于Method的Handler也就是我们常用的 2.HandlerAdapter 调用Handler的适配器。如果把HandlerController当做工具的话那么HandlerAdapter就相当于干活的工人 3.HandlerExceptionResolver 对异常的处理 4.ViewResolver 用来将String类型的视图名和Locale解析为View类型的视图 5.RequestToViewNameTranslator 有的HandlerController处理完后没有设置返回类型比如是void方法这是就需要从request中获取viewName 6.LocaleResolver 从request中解析出Locale。Locale表示一个区域比如zh-cn对不同的区域的用户显示不同的结果这就是i18nSpringMVC中有具体的拦截器LocaleChangeInterceptor 7.ThemeResolver 主题解析这种类似于我们手机更换主题不同的UIcss等 8.MultipartResolver 处理上传请求将普通的request封装成MultipartHttpServletRequest 9.FlashMapManager 用于管理FlashMapFlashMap用于在redirect重定向中传递参数