Spring 面试
问:解释 IOC 容器和DI依赖注入
答:
- IOC容器:控制反转,将创建对象权利交给IOC容器来完成
- DI 依赖注入:获取 IOC 中获取创建好的对象,在Spring 常用的依赖注入有:
- 构造器注入
- set 方法注入
@Autowired
注入
使用 IOC容器和DI依赖注入的好处:
- 降低代码耦合
- 提高了代码的维护性。
问:AOP 是什么
答:AOP 也叫面向切面编程,将一些公共的逻辑抽取出来,使用公共代码复用,减低耦合。比如:日志保存和事务处理都是使用 AOP 来实现的。
问:你们的项目有没有使用到AOP
答:校园食堂外卖订单系统中使用到了AOP来记录系统日志。主要思路:使用 AOP 环绕通知,在主要业务执行完毕,将请求吃和响应结果,保存到数据库中。
问:AOP 还有那些通知方式
答:
- 前置通知:业务代码执行之前执行
- 环绕通知:在业务代码执行的前后都会执行
- 后置通知:
- 异常后置通知:在业务代码执行出现异常的时候执行
- 正常后置通知:在业务代码正常执行完成后执行
- 后置通知:业务代码执行完成后执行(不论是否出现异常都会执行)
问:Spring 中事务是怎么实现
答:使用 AOP 实现,在业务代码执行之前开启页面,在业务代码执行成功,进行事务提交,在业务代码出异常进行事务回滚。
问:Spring 的事务会在那些情况下会失效
答:
- 开发者使用 try-catch 来处理异常,不将异常抛出
- 业务代码出现检查型异常
- 事务方法不是公开的
问:了解Bean 的生命周期吗
答:
- 通过bean定义类获取bean的定义信息
- 调用构造方法实例化bean
- bean的依赖注入
- 处理Aware 接口
- Bean的后置处理 - (前置)
- 初始方法
- Bean的后置处理 - (后置 动态代理)
- 销毁Bean
问:SpringMVC 执行流程
答:在以前的前后端不分离的项目中大致的执行流程是:
- 请求到达前端控制器
- 前端控制器调用处理器映射器查询具体的处理器(方法)
- 处理器映射器返回处理器对象以及拦截器(可能没有)给前端控制器
- 前端控制器调用处理器适配器
- 处理器适配进行适配并调用具体的处理器(Controller)
- Controller 执行并且返回视图模型对象
- 适配器将返回视图模型对象返回给前端控制器
- 前端控制器将返回的视图模型交给视图解析器进行处理
- 视图解析器返回视图给前端控制器
- 前端控制器进行视图渲染返回
在前后端分离的项目中步骤减少了
- 请求到达前端控制器
- 前端控制器调用处理器映射器获取具体的处理器
- 处理器映射器将具体的处理器以及拦截器(可能存在)返回给前端控制器
- 前端控制器调用处理器适配器
- 处理器适配器,进行适配以及调用处理器(Controller )
- 前端控制器将适配器处理器处理好的json数据返回给请求处
问:Springboot自动配置原理?
答:Spring Boot的自动配置原理基于 @SpringBootApplication
注解,它封装了 @SpringBootConfiguration
、@EnableAutoConfiguration
和 @ComponentScan
。@EnableAutoConfiguration
是核心,它通过 @Import
导入配置选择器,读取 META-INF/spring.factories
文件中的类名,根据条件注解决定是否将配置类中的Bean导入到Spring容器中。
问:Mybatis 中分页是怎么实现
答:
常用的实现方式有:
- 在 xml 文件手动使用 limit 等分页关键字实现
- 好处:不需要引入额外的依赖
- 缺点:需要自己计算分页的偏移量,以及不同的数据库使用分页关键字可能不同
- 使用 PageHelper插件
- 好处:自动计算分页偏移量,并且可以适配大多的数据库
- 缺点:引入额外的依赖
问:SpringSecurity
License:
CC BY 4.0