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中的缓存将被清理。

相关推荐
Aphelios3802 分钟前
Java全栈面试宝典:线程协作与Spring Bean管理深度解析
java·开发语言·jvm·spring·面试·职场和发展
努力学习的小廉8 分钟前
【C++11(中)】—— 我与C++的不解之缘(三十一)
android·java·c++
佬乔22 分钟前
xml中配置AOP织入
java·服务器·前端
Eugene__Chen23 分钟前
JavaWeb开发基础知识-XML和JSON
java·开发语言·前端
努力学习的小廉35 分钟前
【C++11(上)】—— 我与C++的不解之缘(三十)
java·开发语言·c++
五行星辰38 分钟前
Fastjson 处理 JSON 生成与解析指南
java·json
nlog3n41 分钟前
Java观察者模式详解
java·开发语言·观察者模式
hello_ejb344 分钟前
聊聊Spring AI的MilvusVectorStore
java·人工智能·spring
程序猿熊跃晖1 小时前
Excel 数据导入与 SQL 生成:基于 Hutool 和 Apache POI 的优雅实践
sql·apache·excel
M malloc1 小时前
【C++奇遇记】C++中的进阶知识(继承(一))
java·jvm·c++