黑马Java热门面试题SSM(六)


目录:

(1)谈谈你对 Spring 的理解?

(2)IOC 是什么? 

(3)IOC 原理?

(4)IOC 的使用场景?

(5)IOC 中 Bean 有几种注入方式?

(6)SpringBean 自动装配的几种方式?

(7)AOP 是什么?

(8)AOP 主要用在哪些场景中?

(9)SpringBean 的作用域有几种?

(10)Spring 事务管理方式?

(11)Spring 事务传播行为有几种?

(12)Spring 中的事务隔离级别?

(13)Spring 中的设计模式有哪些?

(14)Spring 的常用注解有哪些?

(15)@Resources 和@Autowired 的区别?

(16)SpringMVC 执行流程(工作原理)?

(17)SpringMVC 的常用注解有哪些?

(18)SpringMVC 如何处理统一异常?

(19)MyBatis 中#{}和${}的区别是什么?

(20)MyBatis 是如何进行分页的?分页插件的原理是什 么?

(21)MyBatis 动态 SQL 传参,注解是什么?

(22)实体类属性与表字段不一致解决方法?

(23)ResultType 和 ResultMap 的区别?

(24)MyBatis 中有哪些设计模式? 

(25)Mybatis执行流程


(1)谈谈你对 Spring 的理解?

Spring 是一个 IOC 和 AOP 容器框架。 Spring 容器的主要核心是:

• 控制反转(IOC),传统的 java 开发模式中,当需要一个对象时,我们会自己 使用 new 或者 getInstance 等直接或者间接调用构造方法创建一个对象。而在 spring 开发模式中,spring 容器使用了工厂模式为我们创建了所需要的对象, 不需要我们自己创建了,直接调用 spring 提供的对象就可以了,这是控制反 转的思想。

• 依赖注入(DI),spring 使用 javaBean 对象的 set 方法或者带参数的构造方 法为我们在创建所需对象时将其属性自动设置所需要的值的过程,就是依赖注 入的思想。

• 面向切面编程(AOP),在面向对象编程(oop)思想中,我们将事物纵向抽成 一个个的对象。而在面向切面编程中,我们将一个个的对象某些类似的方面横 向抽成一个切面,对这个切面进行一些如权限控制、事物管理,记录日志等。 公用操作处理的过程就是面向切面编程的思想。AOP 底层是动态代理,如果是 接口采用 JDK 动态代理,如果是类采用 CGLIB 方式实现动态代理。

(2)IOC 是什么? 

• IOC(Inversion Of Controll,控制反转)是一种设计思想,就是将原本在程序中 手动创建对象的控制权,交由给 Spring 框架来管理。IOC 在其他语言中也有应 用,并非 Spring 特有。IOC 容器是 Spring 用来实现 IOC 的载体,IOC 容器实际 上就是一个 Map(key, value),Map 中存放 的是各种对象。 将对象之间的相互依赖关系交给 IOC 容器来管理,并由 IOC 容器完成对象的注入。 这样可以很 大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。IOC 容器就像是一个工厂一 样,当我们需要创建一个对象的时候,只需要配置好配置文 件/注解即可,完全不用考虑对象是 如何被创建出来的。在实际项目中一个 Service 类可能由几百甚至上千个类作为它的底层,假 如我们需要实例化这个 Service,可 能要每次都搞清楚这个 Service 所有底层类的构造函数,这 可能会把人逼疯。如果 利用 IOC 的话,你只需要配置好,然后在需要的地方引用就行了,大大增加了项目 的可维护性且降低了开发难度

(3)IOC 原理?

 

(4)IOC 的使用场景?

正常情况下我们使用一个对象时都是需要 new Object() 的。而 ioc 是把需要使用的 对象提前创建好,放到 spring 的容器里面。需要使用的时候直接使用就行,而且可 以设置单例或多例,非常灵活。

我们在 service 层想调用另外一个 service 的方法,不需要去 new 了,直接把它交给 spring 管理,然后用注解的方式引入就能使用。 

 (5)IOC 中 Bean 有几种注入方式?

• 构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该 类有一系列参数,每个参数代表一个对其他类的依赖。

• Setter 方法注入:Setter 方法注入是容器通过调用无参构造器或无参 static 工 厂方法实例化 bean 之后,调用该 bean 的 Setter 方法,即实现了基于 Setter 的依赖注入。

• 基于注解的注入:最好的解决方案是用构造器参数实现强制依赖,Setter 方法 实现可选依赖。

 (6)SpringBean 自动装配的几种方式?

自动装配提供五种不同的模式供 Spring 容器用来自动装配 beans 之间的依赖注入:

• byName:通过参数名自动装配,Spring 容器查找 beans 的属性,这些 beans 在 XML 配置文件 中被设置为 byName。之后容器试图匹配、装配和该 bean 的属 性具有相同名字的 bean。

• byType:通过参数的数据类型自动自动装配,Spring 容器查找 beans 的属性,这 些 beans 在 XML 配置文件中被设置为 byType。之后容器试图匹配和装配和该 bean 的属性类型一样的 bean。如果有多个 bean 符合条件,则抛出错误。

• constructor:这个同 byType 类似,不过是应用于构造函数的参数。如果在 BeanFactory 中不 是恰好有一个 bean 与构造函数参数相同类型,则抛出一个严 重的错误。

• autodetect:如果有默认的构造方法,通过 construct 的方式自动装配,否则使 用 byType 的 方式自动装配。

(7)AOP 是什么?

• AOP:全称 Aspect Oriented Programming,即:面向切面编程。

• AOP(Aspect-Oriented Programming,面向切面编程)能够将那些与业务无关, 却为业务 模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制 等)封装起来,便于减少 系统的重复代码,降低模块间的耦合度,并有利于未 来的可扩展性和可维护性。

• Spring AOP 是基于动态代理的,如果要代理的对象实现了某个接口,那么 Spring AOP 就会使 用 JDK 动态代理去创建代理对象;而对于没有实现接口的对象,就 无法使用 JDK 动态代理,转 而使用 CGlib 动态代理生成一个被代理对象的子类 来作为代理。 当然也可以使用 AspectJ,Spring AOP 中已经集成了 AspectJ, AspectJ 应该算得上是 Java 生态系统中最完整的 AOP 框架了。使用 AOP 之后我 们可以把一些通用功能抽象出来,在需要用到的地方直接使用即可,这样可以 大大简化代码量。我们需要增加新功能也方便,提高了系统的 扩展性。日志功 能、事务管理和权限管理等场景都用到了 AOP。

(8)AOP 主要用在哪些场景中?

• 事务管理 比如项目中使用的事务注解@Transactional

• 日志管理 创建日志切面

• 用于全局异常处理拦截

• 性能统计 将与业务无关的代码,使用 AOP 拦截他们。

• 缓存使用 @Cacheable 和@CacheEvict

• 安全检查 在支付行业往往对安全性要求比较高,我们在保存/接收/发送数据前先要对 数据进行验签/签名/加密等操作,都需要做特殊处理。 比如一个手机号,我们可以通过一个"拦截器"对手机号,身份证号这种敏感 信息做这种特殊处理;

(9)SpringBean 的作用域有几种?

Spring 框架支持以下五种 bean 的作用域:

• singleton:唯一 bean 实例,Spring 中的 bean 默认都是单例的。

• prototype:每次请求都会创建一个新的 bean 实例。

• request:每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有 效。

• session:每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有 效。

• global-session:全局 session 作用域,仅仅在基于 Portlet 的 Web 应用中才有意 义,Spring5 中已经没有了 Portlet。。

(10)Spring 事务管理方式?

• 编程式事务:在代码中硬编码。

• 声明式事务:在配置文件中配置 声明式事务又分为:

–基于 XML 的声明式事务

–基于注解的声明式事务

(11)Spring 事务传播行为有几种?

事务传播行为是为了解决业务层方法之间互相调用的事务问题。当事务方法被另一 个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务 中运行,也可能开启一个新事务,并在自己的事务中运行。在 TransactionDefinition 定义中包括了如下几个表示传播行为的常量:

• 支持当前事务的情况: TransactionDefinition.PROPAGATION_REQUIRED(默认):如果当前存在事务,则加入 该事务;如果当前没有事务,则创建一个新的事务; TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务; 如果当前没有事务,则以非事务的方式继续运行; TransactionDefinition.PROPAGATION_MANDATORY:如果当前存在事务,则加入该 事务;如果当前没有事务,则抛出异常。

• 不支持当前事务的情况: TransactionDefinition.PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当 前存在事务,则把当前事务挂起; TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当 前存在事务,则把当前事务挂起。

TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事 务,则抛出异常。

• 其他情况: TransactionDefinition.PROPAGATION_NESTED:如果当前存在事务,则创建一个事务 作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于 TransactionDefinition.PROPAGATION_REQUIRED。 

(12)Spring 中的事务隔离级别?

TransactionDefinition 接口中定义了五个表示隔离级别的常量:

• TransactionDefinition.ISOLATION_DEFAULT:使用后端数据库默认的隔离级别, MySQL 默认采用的 REPEATABLE_READ(可重复读) 隔离级别,Oracle 默认采 用的 READ_COMMITTED(读已提交) 隔离级别;

• TransactionDefinition.ISOLATION_READ_UNCOMMITTED:最低的隔离级别,允许 读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读;

• TransactionDefinition.ISOLATION_READ_COMMITTED:允许读取并发事务已经提 交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生;

• TransactionDefinition.ISOLATION_REPEATABLE_READ:对同一字段的多次读取结 果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复 读,但幻读仍有可能发生;

• TransactionDefinition.ISOLATION_SERIALIZABLE:最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产 生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严 重影响程序的性能。通常情况下也不会用到该级别。

(13)Spring 中的设计模式有哪些?

• 工厂模式: Spring 使用工厂模式通过 BeanFactory 和 ApplicationContext 创建 bean 对 象。

• 单例模式: Spring 中的 bean 默认都是单例的。

• 代理模式: Spring 的 AOP 功能用到了 JDK 的动态代理和 CGLIB 字节码生成技 术;

• 模板方法: 用来解决代码重复的问题。比如 RestTemplate、jdbcTemplate、 JpaTemplate等以Template结尾的对 数据库操作的类,它们就使用到了模板模 式。

• 观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。定义对 象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的 对象都会得到通知被制动更新,如 Spring 中 listener 的实现 ApplicationListener。

• 包装器设计模式: 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要 会去 访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的 数据源。

• 适配器模式: Spring AOP 的增强或通知(Advice)使用到了适配器模式、Spring MVC 中也是用 到了适配器模式适配 Controller。 

(14)Spring 的常用注解有哪些?

• @Autowired:用于有值设值方法、非设值方法、构造方法和变量。

• @Component:用于注册所有 bean

• @Repository:用于注册 dao 层的 bean

• @Controller:用于注册控制层的 bean

• @Service:用于注册服务层的 bean

• @Component: 用于实例化对象

• @Value: 简单属性的依赖注入

• @ComponentScan: 组件扫描

• @Configuration: 被此注解标注的类,会被 Spring 认为是配置类。Spring 在启动 的时候会自动扫描并加载所有配置类,然后将配置 类中 bean 放入容器

• @Transactional 此 注解可以标在类上,也可以表在方法上,表示当前类中的方 法 具有事务管理功能

(15)@Resources 和@Autowired 的区别?

• 都是用来自动装配的,都可以放在属性的字段上

• @Autowired 通过 byType 的方式实现,而且必须要求这个对象存在!

• @Resource 默认通过 byName 的方式实现,如果找不到名字,则通过 byType 实 现!如果两个都找不到的情况下,就报错!

(16)SpringMVC 执行流程(工作原理)?

MVC 是 Model — View — Controler 的简称,它是一种架构模式,它分离了表现与 交互。它被分为三个核心部件:模型、视图、控制器。

• Model(模型):是程序的主体部分,主要包含业务数据和业务逻辑。在模型层, 还会涉及到用户发布的服务,在服务中会根据不同的业务需求,更新业务模型 中的数据。

• View(视图):是程序呈现给用户的部分,是用户和程序交互的接口,用户会 根据具体的业务需求,在 View 视图层输入自己特定的业务数据,并通过界面 的事件交互,将对应的输入参数提交给后台控制器进行处理。

• Controller(控制器):Controller 是用来处理用户输入数据,以及更新业务模型 的部分。控制器中接收了用户与界面交互时传递过来的数据,并根据数据业务 逻辑来执行服务的调用和更新业务模型的数据和状态。

工作原理:

• 1.客户端(浏览器)发送请求,直接请求到 DispatcherServlet。

• 2.DispatcherServlet 根据请求信息调用 HandlerMapping,解析请求对应的 Handler。

• 3.解析到对应的 Handler(也就是我们平常说的 Controller 控制器)。

• 4.HandlerAdapter 会根据 Handler 来调用真正的处理器来处理请求和执行相对应 的业务逻 辑。

• 5.处理器处理完业务后,会返回一个 ModelAndView 对象,Model 是返回的数据 对象,View 是逻辑上的 View。

• 6.ViewResolver 会根据逻辑 View 去查找实际的 View。

• 7.DispatcherServlet 把返回的 Model 传给 View(视图渲染)。

• 8.把 View 返回给请求者(浏览器)。 

(17)SpringMVC 的常用注解有哪些?

• @RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。用于 类上,则表示类中的所有响应请求的方法都是以该地址作为父路径;

• @RequestBody:注解实现接收 HTTP 请求的 json 数据,将 json 转换为 Java 对象;

• @ResponseBody:注解实现将 Controller 方法返回对象转化为 json 对象响应 给客户。

(18)SpringMVC 如何处理统一异常?

• 方式一: 创建一个自定义异常处理器(实现 HandlerExceptionResolver 接口),并 实现里面 的异常处理方法,然后将这个类交给 Spring 容器管理

• 方式二: 在类上加注解(@ControllerAdvice)表明这是一个全局异常处理类在方法 上加注解 (@ExceptionHandler), 在 ExceptionHandler 中 有 一 个 value 属性, 可以指定可以处理的异常类型 

(19)MyBatis 中#{}和${}的区别是什么?

#{}是预编译处理,${}是字符串替换。Mybatis 在处理#{}时,会将 sql 中的#{}替换为? 号,调用 PreparedStatement 的 set 方法来赋值;Mybatis 在处理${}时,就是把{}替 换成变量的值。

(20)MyBatis 是如何进行分页的?分页插件的原理是什 么?

分页插件的基本原理是使用 Mybatis 提供的插件接口,实现自定义插件,在插 件的拦截方法内拦截待执行的 sql,然后重写 sql,根据 dialect 方言,添加对应 的物理分页语句和物理分页参数。

(21)MyBatis 动态 SQL 传参,注解是什么?

Xml 方式:

1. MyBatis 动态 SQL 可以让我们在 XML 映射文件内,以标签的形式编写动态 SQL, 完成逻辑判断和动态拼接 SQL 的功能;

2. MyBatis 提供了 9 种动态 SQL 标签:trim、where、set、foreach、if、choose、 when、otherwise、bind;

注解方式:

mybatis 注解方式的最大特点就是取消了 Mapper 的 XML 配置,具体的 SQL 脚本 直接写在 Mapper 类或是 SQLProvider 中的方法动态生成 。

mybatis 提供的常用注解有: @Insert 、@Update 、@Select、 @Delete 等标签, 这些注解其实就是 MyBatis 提供的来取代其 XML 配置文件的

@Results 和 @Result 注解

@Results 和 @Result 主要作用是,当有一些特殊的场景需要处理,查询的返回结 果与期望的数据格式不一致时,可以将将数据库中查询到的数值自动转化为具体的属 性或类型,,修饰返回的结果集。比如查询的对象返回值属性名和字段名不一致,或 者对象的属性中使用了枚举等。如果实体类属性和数据库属性名保持一致,就不需要 这个属性来修饰。

 

 

 

(22)实体类属性与表字段不一致解决方法? 

Mybatis+xml:

Mybatis 提供了一个自动驼峰命名规则的设置,但是默认是关闭的,所以当我们没 有设置的时候,这样也是对应不上的。我们就需要在 Mybatis 的配置文件中添加如 下配置

方法 1:通过 sql 语句的字段起别名,别名和实体中的对象属性一致

方法 2: mybatis 最强大的地方 : reslutMap 对象

 (23)ResultType 和 ResultMap 的区别?

• 如果数据库结果集中的列名和要封装实体的属性名完全一致的话用 resultType 属性

• 如果数据库结果集中的列名和要封装实体的属性名有不一致的情况用 resultMap 属 性,通过 resultMap 手动建立对象关系映射,resultMap 要配置 一下表和类的一一对应关系,所以说就算你的字段名和你的实体类的属性名不 一样也没关系,都会给你映射出来

(24)MyBatis 中有哪些设计模式?

Mybatis 至少遇到了以下的设计模式的使用:

• Builder 模式,例如 SqlSessionFactoryBuilder、XMLConfigBuilder、 XMLMapperBuilder、XMLStatementBuilder、CacheBuilder;

• 工厂模式,例如 SqlSessionFactory、ObjectFactory、MapperProxyFactory;

• 单例模式,例如 ErrorContext 和 LogFactory;

• 代理模式,Mybatis 实现的核心,比如 MapperProxy、ConnectionLogger,用的 jdk 的动态代理;还有 executor.loader 包使用了 cglib 或者 javassist 达到延迟加 载的效果;

• 组合模式,例如 SqlNode 和各个子类 ChooseSqlNode 等;

• 模板方法模式,例如 BaseExecutor 和 SimpleExecutor,还有 BaseTypeHandler 和 所有的子类例如 IntegerTypeHandler;

• 适配器模式,例如 Log 的 Mybatis 接口和它对 jdbc、log4j 等各种日志框架的适 配实现;

• 装饰者模式,例如 Cache 包中的 cache.decorators 子包中等各个装饰者的实现;

• 迭代器模式,例如迭代器模式 PropertyTokenizer;

(25)Mybatis执行流程

 

1.读取MyBatis的配置文件。mybatis-config.xml为MyBatis的全局配置文件,用于配置数据库连接信息。


2.加载映射文件。映射文件即SQL映射文件,该文件中配置了操作数据库的SQL语句,需要在MyBatis配置文件mybatis-config.xml中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。


3.构造会话工厂。通过MyBatis的环境配置信息构建会话工厂SqlSessionFactory。


4.创建会话对象。由会话工厂创建SqlSession对象,该对象中包含了执行SQL语句的所有方法。


5.Executor执行器。MyBatis底层定义了一个Executor接口来操作数据库,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。


6.MappedStatement对象。在Executor接口的执行方法中有一个MappedStatement类型的参数,该参数是对映射信息的封装,用于存储要映射的SQL语句的id、参数等信息。


7.输入参数映射。输入参数类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输入参数映射过程类似于JDBC对preparedStatement对象设置参数的过程。


8.输出结果映射。输出结果类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输出结果映射过程类似于JDBC对结果集的解析过程。
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵俺第一专栏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值