来源:B站图灵课堂的视频
1 BeanFactory和ApplicationContext的区别?
- ApplicationContext实现BeanFactory,具备BeanFactory的功能。
- ApplicationContext具备更多的功能,有国际化(MessageSource),环境变量(EnvironmentCapable),事件发布(ApplicationEventPubilsher)。
2 SpringBoot,SpringMVC,和Spring有什么区别?
- Spring是一个IOC容器,用来管理bean,一个使用依赖注入实现控制反转。使用AOP将不同的方法抽取成切面,自动注入给方法执行,比如日志,异常。
- SpringMVC是Spring对web框架的一个解决方案,提供了一个DispatherServlet,处理请求,定义了一套路由策略(URL到handler的映射)以及适配执行handler,将handler处理结果用视图解析器生成视图返回到前端。
- SpringBoot是Spring提供的一个快速开发工具包,便于开发者更方便,快捷开发Spring+SpringMVC应用,简化配置,使用starter整合一些列解决方案(redis,mongodb,es)
3 过滤器和拦截器的 5 个区别!
- 出身不同。过滤器依赖Servlet的包,拦截器依赖Spring的相关包。因此拦截器不仅可以在web项目应用,还能在appliaction,swing应用。
- 触发时机不同。请求-过滤器-servlet-拦截器-controller
- 实现原理不同。过滤器是上一级方法回调。拦截器是动态代理调用实现。
- 场景不同。过滤器偏通用功能过滤(字符编码,敏感词过滤,响应数据压缩),拦截器偏业务功能(权限判断,日志记录,登录判断)
4 Spring事件监听机制概述
SpringBoot中事件监听机制则通过发布-订阅实现,主要包括以下三部分:
- 事件 ApplicationEvent,继承JDK的EventObject,可自定义事件继承ApplicationEvent。
- 事件发布者 ApplicationEventPublisher,负责事件发布自定义事件。
- 事件监听者 ApplicationListener,继承JDK的EventListener,负责监听指定的事件。
5 SpringBoot如何启动Tomcat?
- 创建Spring容器时,会利用@ConditionalOnClass
技术判断当前classpath是否存在tomcat依赖,如果存在则会生成一个启动Tomcat的Bean。 - 容器创建后,获取启动Tomcat的Bean,并创建Tomcat对象,并绑定端口,启动Tomcat。
6 SpringBoot常用注解以及底层实现?
- SpringBootApplication注解:3个注解组合
- @SpringBootConfiguration:这个注解实际是一个@Configuration
- @EnableAutoConfiguration:向Spring导入Selector,并自动加载classpath下META-INF/目录下的spring.factories文件所定义的自动配置类为Bean
- @ComponentScan:标记扫描路径,默认扫描路径是启动类所在包,以及子包。
- @Bean注解:定义Bean,类似XML中的<bean>标签。Spring启动时,会对@Bean注解的方法解析,以方法名为BeanName作为Bean对象的Id。
- @Controller,@Service,@ResponseBody,@AutoWrited
7 SpringBoot中配置文件的加载顺序?
下面是SpringBoot项目读取配置文件的顺序,以优先级排序
- config/application.properties(项目根目录中config目录下)
- config/application.yml
- application.properties(项目根目录下)
- application.yml(项目根目录下)
- resources/config/application.properties(项目- resources目录中config目录下)
- resources/config/application.properties(项目resources目录中config目录下)
- resources/config/application.yml
- resources/application.properties(项目的resources目录下)
- resources/application.yml
8 SpringBoot自动配置原理?
- 判断是否开启自动装配
- 读取META-/INF/spring.factories文件的自动装配的所有配置类
- 根据@ConditionOnXX注解,筛选满足条件的bean对象,并且注册到spring的ioc容器中。
9 如何实现一个Starter?
- 创建spring-boot-xxx-starter工程
- 引入spring boot的的相关依赖
- 创建XXConfigurtaion类,并用@Configuration注解,@Bean和@ConditionOnXX注解在部分方法
- 在resources/创建META-INF/spring.factories
@Configuration 和 @Component 注解的区别?
@Configuration中所有带有@Bean注解的方法都被cglib动态代理,因此该方法返回的实例都是同一个。而@Component中@Bean注解的方法返回的实例都不同。
10 SpringMVC的底层工作流程
- 客户端发送请求到前端控制器DispatcherServlet
- DispaterServlet收到请求调用HandlerMapping处理器映射器。
- HandlerMapping处理器映射器找到对应的处理器,生成处理器以及处理器拦截器一并返回到DispaterServlet
- DispaterServlet调用HandlerAdapter处理器适配器。
- HandlerAdapter经过适配调用具体的处理器Controller,即后端控制器。
- Controller执行并返回ModlerAndView
- HandlerAdapter将controller执行结果ModelAndView返回到DispaterServlet
- DispaterServlet将modelAndView传给ViewReslover视图解析器。
- ViewResolver解析并返回具体的view
- DispaterServlet根据view进行视图渲染,将模型数据填充至视图。
- DispatcherServlet响应用户。
11 SpringMVC的9大组件
- HandlerMapping
处理器映射器,根据用户请求的uri查询对应的Handler。 - HandlerAdapter
处理器适配器,固定的Servlet处理方法调用灵活的Handler来处理。
Handler是用来干活的工具;HandlerMapping是根据需要干的活找对应的工具;HandlerAdapter是使用工具干活的人; - HandlerExceptionResolver 统一异常处理页面
- ViewResolver 视图渲染
- RequestToViewNameTranslator void返回类型交给他处理
- LocaleResolver 国际化
- ThemeResolver 主题解析
- MultipartResolver 上传文件请求
- FlashMapManager 重定向传递参数
12 SrpingMVC的控制器是不是单例模式?如何保证线程安全?
控制器是单例模式。单例模式会有线程安全问题。
Spring保证线程安全的方法
- 将scope设置成非singlton。如:request,prototype
- 控制器设置成无状态模式,不要携带数据,引用无状态的service和dao。
13 Spring框架用了哪些设计模式?
简单工厂:由一个工厂类根据参数,动态创建对象。
Spring中的BeanFactory就是简单工厂模式的体现,根据传入唯一的标识符来获取Bean对象,多例Bean,Lazy-delay是传参后才创建的对象。工厂方法
单例模式:Bean对象。
适配器模式:
AdvisedAdapter-将advisor适配成MethodInterceptor装饰者模式
BeanWrapper-比单纯的Bean对象更强大动态代理:
AOP
@Configuration
@Lazy观察者模式
ApplicationListener-事件监听机制策略模式
InstantiationStrategy-Spring根据BeanDefinition实例化Bean,可以根据不同策略实例化。
BeanNameGenerator-beanName生成器构造器:
BeanDefinitionBuilder-构造器
StringBuilder访问者:
PropertyAccessor-属性访问器
MessageSourceAccessor-国际化资源访问器
14 bean的生命周期
实例化-属性填充-初始化-销毁
1.实例化
new XXX(),主动创建,被动创建AOP,BeanDefinition对象保存
2.属性填充
Spring通过BeanDefinition找到对象依赖的其他对象,并赋予给当前依赖的对象。
3.初始化
Aware接口,BeanNameAware,BeanFactoryAware
BeanPostProcessor接口前置处理,postProcessBeforeInitialization方法
InitializingBean接口,afterPorpertiesSet方法
init-method配置,调用配置的方法
BeanPostProcessor接口后置处理,postProcessAfterInitialzation方法
4.销毁
DisposableBean:销毁前调用destory
destory-method配置
15 Spring的循环依赖
A依赖B,B又依赖A
单例
第一个加载的bean对象不能是构造方法注入
三级缓存,第一级存完整的对象,二级存new后,但没有填充属性,三级存储存储创建bean的工厂对象。
-为什么需要二级缓存不能解决循环依赖?
解决创建aop代理对象,如果在第二级缓存也加上这个判断,那么就会提前初始化代理对象。而代理对象的初始化是在postProcessAfterInitialization才执行的,如果在这里提前初始化,违背bean定义的生命周期。
16 Spring事务失效的场景?
1.public
2.final,static
3.方法内部调用
4.spring是否开启事务
5.库表是否支持事务。MyIASM不支持,InndoDB支持。
6.抛自定义的Exception异常
7.自己处理了异常,没有往外抛
8.事务的传播特性,设置了never,如果上下文没有事务,则会报错。设置了require_new,非同一个事务,也不会回滚
9.事务的传播特性,设置了nest,嵌套事务,比如一个事务方法包含save,update(嵌套事务),则save方法不会回滚。
10.多线程。2个线程执行方法获取的连接不是同一个。
11.没有配置spring事务管理器
17 Spring容器启动流程是怎么样的?
- 扫描得到所有的 n对象,存入Map
- 筛选非懒加载的单例BeanDefinition进行创建Bean。
- 利用BeanDefinition创建Bean,包括Bean的创建的生命周期,包含合并BeanDefinition,推测构造方法,实例化,属性填充,初始化等操作,其中AOP发生在初始化的这一步骤。
- 单例Bean创建完之后,Spring会发布一个容器启动事件。
- Spring启动结束。
18 @PostConstruct怎么实现?
反射,如果方法里的注解等于PostConstruct就会执行。
被@PostConstructor修饰的方法会在服务器加载Servlet(Bean)的时候执行,且只执行一次,类似servlet的init方法。在执行构造方法后,执行init方法前执行。
19 Spring如何处理事务?
- 编程式事务:TransactionTemplate。
- 声明式事务:Spring在AOP基础上提供的事务实现机制。不需要在业务代码添加事务管理的代码,只需要在配置文件中做相关的事务规则声明即可。但是声明式事务只能支持方法级别的,不能针对代码级别。
20 Spring事务的传播级别
- PROPAGATION_REQUIRED 有就加入事务,没有就创建事务。
- PROPAGATION_SUPPORTS 有就加入事务,没有以非实物方式执行。
- PROPAGATION_MANDATORY 有就加入事务,没有就抛出异常
- PROPAGATION_REQUIRED_NEW 无论有没有事务,都新建事务执行。
- PROPAGATION_NOT_SUPPORTED 以非事务执行,如果有事务抛出异常。
- PROPAGATION_NESTED 嵌套事务。外部事务回滚,内部事务必然回滚。内部事务回滚,如果
21 Spring事务的隔离级别
- default:使用数据库默认的事务隔离级别
- 读未提交
- 读已提交
- 可重复读
- 所有事务依次执行
22 Spring支持的几种作用域?
- signletion:单例
- prototype:多例
- request:每一个HTTP请求会创建一个单例对象
- session:每一个session会有创建一个单例对象
- application:ServletContext生命周期复用的一个单例对象。
- websocket:websocket生命周期复用的一个单例对象。
23 Spring的Bean是线程安全的吗?
Spring没有对Bean做线程安全的处理
- 如果Bean是无状态的,那么Bean则是线程安全的。
- 如果Bean是有状态的,那么Bean是线程不安全的。
24 @autowrited和@Resouces
都可以装载bean
@autowrited是spring定义的,默认按照类型查找。
@Resource是J2EE的标准,默认按照名称查找。
25 Spring的事务底层原理?
- 数据库事务和AOP机制。
- @Transactional注解的Bean,创建代理对象
- 调用代理对象的方法,会判断该方法是否加@Transactional注解。
- 如果加了,就会利用事务管理器创建一个数据库连接。
- 且修改数据库连接的autocommit属性为false,禁止自动提交。
- 执行sql
- 提交事务。
- 异常回滚。
- Spring事务的隔离级别=数据库的隔离级别。
- Spring事务的传播机制是Spring事务自己实现的。
- Spring事务的传播机制是基于数据库连接实现的。一个数据库连接=一个事务,新开事务=新创建数据库连接。