java框架八股

  1. spring框架中单例bean是线程安全的吗

    不是线程安全的,spring框架并没有对单例bean进行任何多线程的封装处理。通常在项目中使用的spring bean都是不可变的状态。如果bean有多种状态的话,就需要自行保证线程安全。

  2. 什么是AOP?

    aop是面向切面编程,在spring中用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取公共模块复用,降低耦合,一般比如可以作为公共日志保存,事务处理。

    可以使用aop中的环绕通知+切点表达式,这个表达式就是要找到记录日志的方法,然后通过环绕通知的参数获取请求方法的参数,比如类信息、方法信息、注解等,获取到这些信息后保存到数据库。

  3. spring中的事务是如何实现的

    spring实现的事务本质就是aop,对方法前后进行拦截,在执行方法之前开启事务,在执行方法之后根据执行情况提交或者回滚事务。

  4. spring中事务失效的场景有哪些?

    1如果方法上异常捕获处理,自己处理了异常,没有抛出,就会导致事务失败

    2如果方法抛出检查异常,如果报错也会导致事务失败,可以在@Transactional上配置rollbackFor属性为Exception,这样就会回滚事务。

    3如果方法上不是public修饰的,也会导致事务失效。

  5. spring中bean的生命周期

    1首先通过一个非常重要的类,叫做BeanDefinition获取bean的定义信息。包括类的全路径、是否延迟加载、是否是单列。

    2创建bean的时候,第一步是调用构造函数实例化bean,第二步是bean的依赖注入,比如一些set方法注入,都是用@Autowire完成的

    3第三步是处理Aware接口,如果某个bean实现了Aware接口就会重写方法执行

    4第四步是bean的后置处理器BeanPostProcessor,这个是前置处理器

    5第五步是初始化方法,比如实现接口的方法或者自定义了方法

    6第六步是执行bean的后置处理器BeanPostProcessor,主要是对bean进行增强,有可能在这里产生代理对象。

    7最后一步是销毁bean

  6. spring中bean的循环引用?

    循环依赖:循环依赖其实是循环引用,也就是两个或者两个以上的bean互相持有对方,最终形成闭环。比如A依赖B,B依赖于A。

    循环以来在spring中是允许的,spring框架的三级缓存解决了大部分的循环依赖

    一级缓存:单例池,缓存已经经历了完整的生命周期,已经初始化完成的bean对象

    二级缓存:缓存早期的bean对象(生命周期还没走完)

    三级缓存:缓存的是ObjectFactory,表示对象工厂,用来创建某个对象。

    具体流程如下:

    第一,先实例A对象,同时会创建ObjectFactory对象进入三级缓存

    第二,A在初始化的时候需要B对象,这个走B的创建逻辑

    第三,B实例化完成,也会创建ObjectFactory对象进入三级缓存

    第四,B需要注入A,通过三级缓存中获取ObjectFactory来生成一个A的对象同时存入二级缓存中,这个是有两种情况:一个是可能是A的普通对象,另外一个是A的代理对象,都可以让ObjectFactory来生产对应的对象

    第五,B通过从二级缓存获得到A的对象后可以正常注入,B创建成功,存入一级缓存

    第六,回到A对象初始化,B已经完成了创建,则可以直接注入B,A创建成功存入一级缓存。

    第七,二级缓存中的临时对象A清除。

  7. 构造方法中出现了循环依赖怎么解决?

    由于bean的生命周期中构造函数是第一个执行的,spring框架并不能解决构造函数的依赖注入,可以使用@lazy懒加载,什么时候需要对象再进行bean的创建。

  8. spring MVC执行流程?

    1用户发送请求到前端控制器,这是一个调度中心

    2前端控制器收到请求调用处理器映射器

    3处理器映射器找到具体的处理器,生成处理器对象以及处理器拦截器,再一起返回给前端控制器

    4前端控制器调用处理器适配器

    5处理器适配器经过适配调用具体的处理器

    6处理器执行完成后返回ModelAndView对象

    7处理器适配器将处理器执行结果返回给前端控制器

    8前端控制器将ModelAndView传给视图解析器

    9视图解析器解析后返回具体的视图

    10前端控制器根据视图进行渲染视图

    11前端控制器响应用户

    现在的开发都是前后端分离,没有视图这些,一般都是处理器中使用response直接将结果返回。

  9. spring自动配置原理

    springboot项目中引导类上有一个注解,@springbootapplication,它对三个注解进行了封装,其中包括@springbootconfiguration、@enableautoconfiguration、@componentscan。其中@enableautoconfiguration是实现自动装配的核心注解。

    该注解通过@import注解导入对应的配置选择器,关键是内部就读取了该项目和该项目引用的jar包的spring.factories文件中所配置的类的全类名。

    在这些配置类中所定义的bean会根据条件注解所指定的条件决定是否导入到spring容器中。

  10. mybatis执行流程?

    1读取mybatis配置文件:mybatis-config.xml加载运行环境和映射文件

    2构造会话工厂,一个项目只需要一个,单例的。

    3会话工厂创建sqlsession对象,这里面包含了执行sql语句的所有方法

    4操作数据库的接口,executor执行器,同时负责查询缓存的维护

    5executor接口的执行方法中有一个mappedstatement类型的参数,封装了映射信息

    6输入参数映射

    7输出参数映射

  11. mybatis是否支持延迟加载?

    支持,延迟加载是在需要用到数据的时候才进行加载,不需要用的时候不加载数据

    mybatis支持一对一关联对象和一对多关联集合对象的延迟加载

    默认是关闭状态

  12. 延迟加载底层原理?

    1使用CGLIB创建目标对象的代理对象,这里的目标对象就开启了延迟加载的mapper

    2当调用方法的时候,进入拦截器invoke方法,发现目标方法是null值,再执行sql查询。

    3获取数据以后,调用set方法设置属性值,再继续查询目标方法,就有值了。

  13. mybatis一级二级缓存

    mybatis的一级缓存:基于perpetualcache的hashmap本地缓存,其存储作用域为session,当session进行fulsh或close之后,该session中的所有cache就将清空,默认打开一级缓存

    关于二级缓存需要单独开启

    二级缓存是基于namesapce和mapper的作用域起作用,不是依赖于sqlsession。

    如果想要开启二级缓存需要在配置文件和映射文件中开启配置才行。

  14. mybatis的二级缓存什么时候会清理缓存中的数据?

    当某一个作用域(一级缓存session\二级缓存namespaces)的进行了新增、修改、删除操作后,默认该作用域下所有select中的缓存将被清理。

相关推荐
喵手31 分钟前
如何利用Java的Stream API提高代码的简洁度和效率?
java·后端·java ee
-Xie-33 分钟前
Maven(二)
java·开发语言·maven
IT利刃出鞘1 小时前
Java线程的6种状态和JVM状态打印
java·开发语言·jvm
薛晓刚1 小时前
当MySQL的int不够用了
数据库
SelectDB技术团队1 小时前
Apache Doris 在菜鸟的大规模湖仓业务场景落地实践
数据库·数据仓库·数据分析·apache doris·菜鸟技术
星空下的曙光2 小时前
mysql 命令语法操作篇 数据库约束有哪些 怎么使用
数据库·mysql
小楓12012 小时前
MySQL數據庫開發教學(一) 基本架構
数据库·后端·mysql
天天摸鱼的java工程师2 小时前
Java 解析 JSON 文件:八年老开发的实战总结(从业务到代码)
java·后端·面试
白仑色2 小时前
Spring Boot 全局异常处理
java·spring boot·后端·全局异常处理·统一返回格式
染落林间色2 小时前
达梦数据库-实时主备集群部署详解(附图文)手工搭建一主一备数据守护集群DW
数据库·sql