01-框架篇简介
02-Spring-单例bean是线程安全的吗?
前置问题:Spring框架中的bean是单例的吗?
答:是的
那么它是线程安全的吗?(默认singleton)
答:不是线程安全的。
成员方法需要考虑线程安全
answer:
03-Spring-AOP相关面试题
AOP:Aspect Oriented Programming 面向切面编程
何为切面:将与业务无关的公共行为或逻辑 抽取并封装成一个模块,这个模块成为“切面”(Aspect)。
用@Aspect来注明切面类
Q:Spring中的事物是如何实现的?
04-Spring-事务失效的场景
假设账户1给账户2转账,此处运行后,账户1扣除转账金额,但是账户2没有获得转账。
AOP实现的事务,不能处理自己处理之后的异常,它只能处理被抛出的异常。
非检查异常:如IndexOutOfBoundsException(运行时异常)
而检查性异常包括:SQLException、FileNotFoundException等
编译器要检查这类异常,一方面是因为该类异常的发生难以避免,
另一方面就是让开发者去解决掉这类异常,所以称为必须处理的异常。
解决:只要有异常就回滚事务
只要不用public修饰这个方法,就会导致失效。
05-Spring-bean的生命周期
为什么要问这个问题?
了解了bean的生命周期后——我们能更好的了解Spring的框架、更好的理解Spring
Bean生命周期:根本听不懂啊…
Bean的创建和初始化是分开的
最后销毁bean
看不懂这个,但是有代码呀!
1、BeanDefinition
2、构造函数
3、依赖注入
4、实现Aware接口
5、BeanPostProcessor#before
6、初始化方法
自定义初始化方法
7、BeanPostProcessor#after
这个比较重要
它的作用:对象需要代理、增强
8、销毁
(其实讲了一遍听了两三遍以后还是没那么懂…
06-Spring-bean的循环依赖(引用)
简而言之,就是实例化A需要B的对象,但是实例化B需要A的对象,循环依赖,
导致既不能实例化(或者说初始化)A也不能实例化B。
解决方法:三级缓存
一级缓存无法解决循环依赖
因为只有当bean对象完全初始化完成,才会存入一级缓存中。
如果我们加入二级缓存,它相当于一个中间人的作用,
可以将生命周期还没走完的bean对象存入缓存中并可以提供给其他对象进行初始化。
那么既然已经解决了两级缓存的问题,为什么还需要第三级缓存?
原因:如果一个对象是代理对象(被增强了)——借助三级缓存
从对象工厂中获取的对象可以创建代理对象(如果需要的话)或者普通对象
如果构造方法中出现了循环依赖怎么解决?
因为三级缓存只能解决bean对象从依赖注入开始的循环依赖,而对于构造函数这部分不能解决。
注解@Lazy 延迟加载(什么时候实例化,什么时候注入)
07-SpringMVC-执行流程
前端控制器接受所有请求
执行顺序:前端控制器——处理器映射器——处理器适配器——(处理器)——视图解析器
在当前的开发中,有一些变化。
因为目前的开发多为前后端分离的 接口开发 异步请求
@ResponseBody注解作用:通过HttpMessageConverter将结果转换为JSON并响应,不存在视图部分。
08-SpringBoot-自动配置原理
实现自动配置的核心注解:@EnableAutoConfiguration
@Import
导入自动配置的选择器
Spring. Factories
自动配置类包括:RabbitMQ、缓存等等
打开缓存自动配置类
@Bean
@ConditionalOnMissingBean
如果Spring容器中没有该对象,则创建并放入Spring容器中;
如果已经有了,则不执行下面的代码了哦。
面试回答:
09-Spring框架常见的注解
Spring、springMVC、springboot的常见注解
1、Spring常见注解
2、SpringMVC注解
3、Springboot注解
就上一节说的那仨
注意不要混淆他们