Spring篇

来源:B站图灵课堂的视频

1 BeanFactory和ApplicationContext的区别?
  1. ApplicationContext实现BeanFactory,具备BeanFactory的功能。
  2. ApplicationContext具备更多的功能,有国际化(MessageSource),环境变量(EnvironmentCapable),事件发布(ApplicationEventPubilsher)。
2 SpringBoot,SpringMVC,和Spring有什么区别?
  1. Spring是一个IOC容器,用来管理bean,一个使用依赖注入实现控制反转。使用AOP将不同的方法抽取成切面,自动注入给方法执行,比如日志,异常。
  2. SpringMVC是Spring对web框架的一个解决方案,提供了一个DispatherServlet,处理请求,定义了一套路由策略(URL到handler的映射)以及适配执行handler,将handler处理结果用视图解析器生成视图返回到前端。
  3. SpringBoot是Spring提供的一个快速开发工具包,便于开发者更方便,快捷开发Spring+SpringMVC应用,简化配置,使用starter整合一些列解决方案(redis,mongodb,es)
3 过滤器和拦截器的 5 个区别!
  1. 出身不同。过滤器依赖Servlet的包,拦截器依赖Spring的相关包。因此拦截器不仅可以在web项目应用,还能在appliaction,swing应用。
  2. 触发时机不同。请求-过滤器-servlet-拦截器-controller
  3. 实现原理不同。过滤器是上一级方法回调。拦截器是动态代理调用实现。
  4. 场景不同。过滤器偏通用功能过滤(字符编码,敏感词过滤,响应数据压缩),拦截器偏业务功能(权限判断,日志记录,登录判断)
4 Spring事件监听机制概述

SpringBoot中事件监听机制则通过发布-订阅实现,主要包括以下三部分:

  1. 事件 ApplicationEvent,继承JDK的EventObject,可自定义事件继承ApplicationEvent。
  2. 事件发布者 ApplicationEventPublisher,负责事件发布自定义事件。
  3. 事件监听者 ApplicationListener,继承JDK的EventListener,负责监听指定的事件。
5 SpringBoot如何启动Tomcat?
  1. 创建Spring容器时,会利用@ConditionalOnClass
    技术判断当前classpath是否存在tomcat依赖,如果存在则会生成一个启动Tomcat的Bean。
  2. 容器创建后,获取启动Tomcat的Bean,并创建Tomcat对象,并绑定端口,启动Tomcat。
6 SpringBoot常用注解以及底层实现?
  1. SpringBootApplication注解:3个注解组合
  • @SpringBootConfiguration:这个注解实际是一个@Configuration
  • @EnableAutoConfiguration:向Spring导入Selector,并自动加载classpath下META-INF/目录下的spring.factories文件所定义的自动配置类为Bean
  • @ComponentScan:标记扫描路径,默认扫描路径是启动类所在包,以及子包。
  1. @Bean注解:定义Bean,类似XML中的<bean>标签。Spring启动时,会对@Bean注解的方法解析,以方法名为BeanName作为Bean对象的Id。
  2. @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的底层工作流程
  1. 客户端发送请求到前端控制器DispatcherServlet
  2. DispaterServlet收到请求调用HandlerMapping处理器映射器。
  3. HandlerMapping处理器映射器找到对应的处理器,生成处理器以及处理器拦截器一并返回到DispaterServlet
  4. DispaterServlet调用HandlerAdapter处理器适配器。
  5. HandlerAdapter经过适配调用具体的处理器Controller,即后端控制器。
  6. Controller执行并返回ModlerAndView
  7. HandlerAdapter将controller执行结果ModelAndView返回到DispaterServlet
  8. DispaterServlet将modelAndView传给ViewReslover视图解析器。
  9. ViewResolver解析并返回具体的view
  10. DispaterServlet根据view进行视图渲染,将模型数据填充至视图。
  11. DispatcherServlet响应用户。
11 SpringMVC的9大组件
  1. HandlerMapping
    处理器映射器,根据用户请求的uri查询对应的Handler。
  2. HandlerAdapter
    处理器适配器,固定的Servlet处理方法调用灵活的Handler来处理。
    Handler是用来干活的工具;HandlerMapping是根据需要干的活找对应的工具;HandlerAdapter是使用工具干活的人;
  3. HandlerExceptionResolver 统一异常处理页面
  4. ViewResolver 视图渲染
  5. RequestToViewNameTranslator void返回类型交给他处理
  6. LocaleResolver 国际化
  7. ThemeResolver 主题解析
  8. MultipartResolver 上传文件请求
  9. FlashMapManager 重定向传递参数
12 SrpingMVC的控制器是不是单例模式?如何保证线程安全?

控制器是单例模式。单例模式会有线程安全问题。
Spring保证线程安全的方法

  1. 将scope设置成非singlton。如:request,prototype
  2. 控制器设置成无状态模式,不要携带数据,引用无状态的service和dao。
13 Spring框架用了哪些设计模式?
  1. 简单工厂:由一个工厂类根据参数,动态创建对象。
    Spring中的BeanFactory就是简单工厂模式的体现,根据传入唯一的标识符来获取Bean对象,多例Bean,Lazy-delay是传参后才创建的对象。

  2. 工厂方法

  3. 单例模式:Bean对象。

  4. 适配器模式:
    AdvisedAdapter-将advisor适配成MethodInterceptor

  5. 装饰者模式
    BeanWrapper-比单纯的Bean对象更强大

  6. 动态代理:
    AOP
    @Configuration
    @Lazy

  7. 观察者模式
    ApplicationListener-事件监听机制

  8. 策略模式
    InstantiationStrategy-Spring根据BeanDefinition实例化Bean,可以根据不同策略实例化。
    BeanNameGenerator-beanName生成器

  9. 构造器:
    BeanDefinitionBuilder-构造器
    StringBuilder

  10. 访问者:
    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容器启动流程是怎么样的?
  1. 扫描得到所有的 n对象,存入Map
  2. 筛选非懒加载的单例BeanDefinition进行创建Bean。
  3. 利用BeanDefinition创建Bean,包括Bean的创建的生命周期,包含合并BeanDefinition,推测构造方法,实例化,属性填充,初始化等操作,其中AOP发生在初始化的这一步骤。
  4. 单例Bean创建完之后,Spring会发布一个容器启动事件。
  5. Spring启动结束。
18 @PostConstruct怎么实现?

反射,如果方法里的注解等于PostConstruct就会执行。
被@PostConstructor修饰的方法会在服务器加载Servlet(Bean)的时候执行,且只执行一次,类似servlet的init方法。在执行构造方法后,执行init方法前执行。

19 Spring如何处理事务?
  1. 编程式事务:TransactionTemplate。
  2. 声明式事务:Spring在AOP基础上提供的事务实现机制。不需要在业务代码添加事务管理的代码,只需要在配置文件中做相关的事务规则声明即可。但是声明式事务只能支持方法级别的,不能针对代码级别。
20 Spring事务的传播级别
  1. PROPAGATION_REQUIRED 有就加入事务,没有就创建事务。
  2. PROPAGATION_SUPPORTS 有就加入事务,没有以非实物方式执行。
  3. PROPAGATION_MANDATORY 有就加入事务,没有就抛出异常
  4. PROPAGATION_REQUIRED_NEW 无论有没有事务,都新建事务执行。
  5. PROPAGATION_NOT_SUPPORTED 以非事务执行,如果有事务抛出异常。
  6. PROPAGATION_NESTED 嵌套事务。外部事务回滚,内部事务必然回滚。内部事务回滚,如果
21 Spring事务的隔离级别
  1. default:使用数据库默认的事务隔离级别
  2. 读未提交
  3. 读已提交
  4. 可重复读
  5. 所有事务依次执行
22 Spring支持的几种作用域?
  1. signletion:单例
  2. prototype:多例
  3. request:每一个HTTP请求会创建一个单例对象
  4. session:每一个session会有创建一个单例对象
  5. application:ServletContext生命周期复用的一个单例对象。
  6. websocket:websocket生命周期复用的一个单例对象。
23 Spring的Bean是线程安全的吗?

Spring没有对Bean做线程安全的处理

  1. 如果Bean是无状态的,那么Bean则是线程安全的。
  2. 如果Bean是有状态的,那么Bean是线程不安全的。
24 @autowrited和@Resouces

都可以装载bean
@autowrited是spring定义的,默认按照类型查找。
@Resource是J2EE的标准,默认按照名称查找。

25 Spring的事务底层原理?
  1. 数据库事务和AOP机制。
  2. @Transactional注解的Bean,创建代理对象
  3. 调用代理对象的方法,会判断该方法是否加@Transactional注解。
  4. 如果加了,就会利用事务管理器创建一个数据库连接。
  5. 且修改数据库连接的autocommit属性为false,禁止自动提交。
  6. 执行sql
  7. 提交事务。
  8. 异常回滚。
  9. Spring事务的隔离级别=数据库的隔离级别。
  10. Spring事务的传播机制是Spring事务自己实现的。
  11. Spring事务的传播机制是基于数据库连接实现的。一个数据库连接=一个事务,新开事务=新创建数据库连接。
26
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 什么是spring spring是一个轻量级的容器框架,目的是简化企业应用开发,核心有两大功能IOC和AOP,通过...
    小丸子的呆地阅读 440评论 0 1
  • 更多内容已开源在我的github:https://github.com/lvminghui/Java-Notes ...
    纳尔的十一阅读 230评论 0 1
  • 1、Spring优点: 低侵入式的设计,代码污染度低; 独立于各种应用服务器,基于Spring框架的应用真正实现了...
    与搬砖有关的日子阅读 650评论 0 1
  • 什么是Spring Spring是一个开源的Java EE开发框架。Spring框架的核心功能可以应用在任何Jav...
    jemmm阅读 16,438评论 1 133
  • 一 .spring 1. 介绍 (1)spring是一个轻量级的,ioc/aop的开源的分层框架低入侵/低耦合 (...
    渺小_1912阅读 2,387评论 0 3