前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Java基础面试题【五】Spring

Java基础面试题【五】Spring

作者头像
@派大星
发布2023-09-22 19:34:34
发布2023-09-22 19:34:34
1870
举报
文章被收录于专栏:码上遇见你码上遇见你

Spring中的Bean创建的⽣命周期有哪些步骤

Spring中⼀个Bean的创建⼤概分为以下⼏个步骤:

  • 推断构造⽅法
  • 实例化
  • 填充属性,也就是依赖注⼊
  • 处理Aware回调
  • 初始化前,处理@PostConstruct注解
  • 初始化,处理InitializingBean接⼝
  • 初始化后,进⾏AOP当然其实真正的步骤更加细致,可以看下⾯的流程图

image.png

Spring中Bean是线程安全的吗

Spring本身并没有针对Bean做线程安全的处理,所以:

  • 如果Bean是**⽆状态的**,那么Bean则是线程安全的
  • 如果Bean是**有状态的**,那么Bean则不是线程安全的。另外,Bean是不是线程安全,跟Bean的作⽤域没有关系,Bean的作⽤域只是表示Bean的⽣命周期范围,对于任何⽣命周期的Bean都是⼀个对象,这个对象是不是线程安全的,还是得看这个Bean对象本身。

有状态会话bean :每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束。即每个用户最初都会得到一个初始的bean。

无状态会话bean :bean一旦实例化就被加进会话池中,各个用户都可以共用。即使用户已经消亡,bean 的生命期也不一定结束,它可能依然存在于会话池中,供其他用户调用。由于没有特定的用户,那么也就不能保持某一用户的状态,所以叫无状态bean。但无状态会话bean 并非没有状态,如果它有自己的属性(变量),那么这些变量就会受到所有调用它的用户的影响,这是在实际应用中必须注意的。

ApplicationContext和BeanFactory有什么区别

BeanFactory是Spring中⾮常核⼼的组件,表示Bean⼯⼚,可以⽣成Bean,维护Bean,⽽ApplicationContext继承了BeanFactory,所以ApplicationContext拥有BeanFactory所有的特点,也是⼀个Bean⼯⼚,但是ApplicationContext除了继承了BeanFactory之外,还继承了诸如EnvironmentCapableMessageSourceApplicationEventPublisher等接⼝,从⽽ApplicationContext还有获取系统环境变量、国际化、事件发布等功能,这是BeanFactory所不具备的。

Spring中的事务是如何实现的

  • Spring事务底层是基于数据库事务和AOP机制的
  • ⾸先对于使⽤了@Transactional注解的Bean,Spring会创建⼀个代理对象作为Bean
  • 当调⽤代理对象的⽅法时,会先判断该⽅法上是否加了@Transactional注解
  • 如果加了,那么则利⽤事务管理器创建⼀个数据库连接
  • 并且修改数据库连接的autocommit属性为false,禁⽌此连接的⾃动提交,这是实现Spring事务⾮常重要的⼀步
  • 然后执⾏当前⽅法,⽅法中会执⾏sql
  • 执⾏完当前⽅法后,如果没有出现异常就直接提交事务
  • 如果出现了异常,并且这个异常是需要回滚的就会回滚事务,否则仍然提交事务
  • Spring事务的隔离级别对应的就是数据库的隔离级别
  • Spring事务的传播机制是Spring事务⾃⼰实现的,也是Spring事务中最复杂的
  • Spring事务的传播机制是基于数据库连接来做的,⼀个数据库连接⼀个事务,如果传播机制配置为需要新开⼀个事务,那么实际上就是先建⽴⼀个数据库连接,在此新数据库连接上执⾏sql

image.png

Spring中什么时候@Transactional会失效

因为Spring事务是基于代理来实现的,所以某个加了@Transactional的⽅法只有是被代理对象调⽤时,那么这个注解才会⽣效,所以如果是被代理对象来调⽤这个⽅法,那么@Transactional是不会失效的。同时如果某个⽅法是private的,那么@Transactional也会失效,因为底层cglib是基于⽗⼦类来实现的,⼦类是不能重载⽗类的private⽅法的,所以⽆法很好的利⽤代理,也会导致@Transactianal失效。具体失效的情况也可参考之前的文章:

Spring事务失效的12种场景总结

Spring容器启动流程是怎样的

  • 在创建Spring容器,也就是启动Spring时:
  • ⾸先会进⾏扫描,扫描得到所有的BeanDefinition对象,并存在⼀个Map中
  • 然后筛选出⾮懒加载的单例BeanDefinition进⾏创建Bean,对于多例Bean不需要在启动过程中去进⾏创建,对于多例Bean会在每次获取Bean时利⽤BeanDefinition去创建
  • 利⽤BeanDefinition创建Bean就是Bean的创建⽣命周期,这期间包括了合并BeanDefinition、推断构造⽅法、实例化、属性填充、初始化前、初始化、初始化后等步骤,其中AOP就是发⽣在初始化后这⼀步骤中
  • 单例Bean创建完了之后,Spring会发布⼀个容器启动事件
  • Spring启动结束
  • 在源码中会更复杂,⽐如源码中会提供⼀些模板⽅法,让⼦类来实现,⽐如源码中还涉及到⼀些BeanFactoryPostProcessorBeanPostProcessor的注册,Spring的扫描就是通过BenaFactoryPostProcessor来实现的,依赖注⼊就是通过BeanPostProcessor来实现的
  • 在Spring启动过程中还会去处理@Import等注解

Spring⽤到了哪些设计模式

image.png

SpringMVC的底层⼯作流程

  • ⽤户发送请求⾄前端控制器`DispatcherServlet 。
  • DispatcherServlet收到请求调⽤HandlerMapping处理器映射器。
  • 处理器映射器找到具体的处理器(可以根据xml配置、注解进⾏查找),⽣成处理器及处理器拦截器(如果有则⽣成)⼀并返回给DispatcherServlet
  • DispatcherServlet调⽤HandlerAdapter处理器适配器。
  • HandlerAdapter经过适配调⽤具体的处理器(Controller,也叫后端控制器)
  • Controller执⾏完成返回ModelAndView
  • HandlerAdaptercontroller执⾏结果ModelAndView返回给DispatcherServlet
  • DispatcherServletModelAndView传给ViewReslover视图解析器。
  • ViewReslover解析后返回具体View
  • DispatcherServlet根据View进⾏渲染视图(即将模型数据填充⾄视图中)。
  • DispatcherServlet响应⽤户。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-09-22 08:13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码上遇见你 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Spring中的Bean创建的⽣命周期有哪些步骤
  • Spring中Bean是线程安全的吗
  • ApplicationContext和BeanFactory有什么区别
  • Spring中的事务是如何实现的
  • Spring中什么时候@Transactional会失效
  • Spring⽤到了哪些设计模式
  • SpringMVC的底层⼯作流程
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档