• 每日五道java面试题之spring篇(三)


    在这里插入图片描述

    第一题 ApplicationContext和BeanFactory有什么区别?

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

    第二题 Spring中的事务是如何实现的?

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

    第三题 Spring中什么时候@Transactional会失效?

    因为Spring事务是基于代理来实现的,所以某个加了@Transactional的⽅法只有是被代理对象调⽤时,
    那么这个注解才会⽣效,所以如果是被代理对象来调⽤这个⽅法,那么@Transactional是不会失效的。

    同时如果某个⽅法是private的,那么@Transactional也会失效,因为底层cglib是基于⽗⼦类来实现
    的,⼦类是不能重载⽗类的private⽅法的,所以⽆法很好的利⽤代理,也会导致@Transactianal失效

    第四题 Spring容器启动流程是怎样的?

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

    第五题 Spring Boot、Spring MVC 和 Spring 有什么区别?

    spring是⼀个IOC容器,⽤来管理Bean,使⽤依赖注⼊实现控制反转,可以很⽅便的整合各种框架,提供AOP机制弥补OOP的代码重复问题、更⽅便将不同类不同⽅法中的共同处理抽取成切⾯、⾃动注⼊给⽅法执⾏,⽐如⽇志、异常等

    springmvc是spring对web框架的⼀个解决⽅案,提供了⼀个总的前端控制器Servlet,⽤来接收请求,然后定义了⼀套路由策略(url到handle的映射)及适配执⾏handle,将handle结果使⽤视图解析技术⽣成视图展现给前端

    springboot是spring提供的⼀个快速开发⼯具包,让程序员能更⽅便、更快速的开发spring+springmvc应⽤,简化了配置(约定了默认配置),整合了⼀系列的解决⽅案(starter机制)、redis、mongodb、es,可以开箱即⽤

    如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力
    在这里插入图片描述

  • 相关阅读:
    win10 mmdetection3d环境搭建
    LeetCode第39题-组合总和-java实现-图解思路与手撕代码
    Codeforces Round #835 (Div. 4) G. SlavicG‘s Favorite Problem
    CNN反向求导推导
    9.30号作业
    Company personnel management Privacy Policy
    2020研究生数学建模竞赛C题——面向康复工程的脑电信号分析和判别模型——论文研读
    OpenFeign
    【数组】移动所有球到每个盒子所需的最小操作数
    微服务项目实战-黑马头条(三):APP端文章详情
  • 原文地址:https://blog.csdn.net/m0_74436895/article/details/136245176