Java面试题-SSM框架

文章目录

1.Spring框架

1.Spring的IOC你是怎么实现的?
  1. 使用dom4j解析,spring的xml文件,就可以的到要扫描包的路径,把点换成/
  2. 然后通过系统类加载器的getResource方法来加载资源,经过处理后得到包下面所有的class对象
  3. 接下来就进行扫描,如果有@Component注解,就反射创建bean对象然后放到单例池
  4. 最后实现一个getBean方法,在内部完成依赖注入,就是通过反射判断,属性是否加了自定义的依赖注入注解,如果没加,就直接返回,加了就反射给属性设置值即可
2.Spring的AOP是如何实现的?
  1. 先自定义@Aspect,@Before,@After注解,然后切点表达式写的是全类名.方法名
  2. 在扫描bean的时候,如果发现有@Aspect注解,就反射提取两个Map
    1. 第一个map是切面信息,key是切点表达式,value是这个切面类的Class对象
    2. 第二个map是通知信息,key是被AOP的方法名,value也是一个map,key是通知类型(0是前置,1是返回),value是具体通知的Method对象
  3. 初始化阶段之后,BeanProcesserAfter之前,可以通过切面信息来判断当前的bean是否被aop了,如果被aop了,就根据切面信息和通知信息来返回代理对象(切面信息获取切面类的Class对象,通知信息可以获取通知的Method对象,直接method.invoke调用即可)
3.Spring的单例bean是线程安全的吗?

不一定,有状态的是线程不安全的,无状态的是线程安全的。有状态的指的就是注入了一个单例bean,然后有成员方法去改变他的值,因为SpringBoot默认就是多线程的,所以一定是线程不安全的。无状态的指的就是注入了像Service和Dao的bean,这种就是线程安全的。

4.Spring事务失效的场景?

补充:JDK代理只能代理public的

5.Spring Bean的三级缓存是怎么解决循环依赖的?
  • 前提条件:A依赖B,B也依赖A
  • 此时在A的三级缓存中就会判断是否被代理了,从而返回一个代理对象或者是普通对象,放到二级缓存中
  • 然后B先从A的一级缓存中找,发现找不到,然后就从二级缓存中找,找到了之后就使用这个A的早期引用去完成初始化,然后放到B的一级缓存中
  • 接下来A从B的一级缓存中找到了实例,就会完成A的初始化,然后放到A的一级缓存中
  • 最后清理二三级缓存,确保最终初始化后的实例都在一级缓存中
6.Spring解决循环依赖一定需要三级缓存吗?

循环依赖不需要三级缓存,但是AOP机制就需要了,因为三级缓存就是去判断该对象是否被AOP了,从而去返回代理对象或者普通对象,如果只是二级缓存,那么就没办法去判断了。

2.SpringMVC框架

1.SpringMVC执行流程
2.SpringMVC的核心机制你是怎么实现的?
1.请求分发
  1. 实现中央控制器,中央控制器就是一个servlet,配置了load-on-startup,所以在Tomcat启动的时候就会调用这个方法,这个方法主要是完成两个工作,一个是Spring容器初始化,一个是初始化映射器
  2. 初始化映射器,扫描所有的Controller,反射初始化映射器列表,每个HandlerMapping对象里面有三个参数,请求路径,Controller,方法对象
  3. 适配器完成请求分发,中央控制器根据请求来查询映射器找到指定的HanderMapping,将这个交给适配器来反射调用具体的方法
2.参数解析
  1. 适配器在得到HanderMapping之后,调用参数解析器进行参数解析
  2. 参数的解析主要就是根据Method对象的形参类型数组,然后返回一个对应的实参数组
  3. 就是解析形参列表中是否有@RequestParam注解,如果有,就读取里面的name,然后从请求中获取到实参,然后放到跟形参数组对应的实参数组的位置
  4. 最后在适配器调用这个方法的时候传入这个实参数组即可
3.视图解析
  1. 适配器将结果返回给中央控制器,然后中央控制器判断这个方法是否有@ResponseBody注解,如果有的话,就直接返回json给浏览器
  2. 如果没有就将结果响应给视图解析器,视图解析器去以冒号分割,根据冒号前面的redirect或者forward来决定是请求转发还是重定向到指定的视图。
相关推荐
float_六七几秒前
IntelliJ IDEA断点调试全攻略
java·ide·intellij-idea
Tiger_shl2 分钟前
【.Net技术栈梳理】02-核心框架与运行时(GC管理)
开发语言·.net
渣哥7 分钟前
面试官最爱追问:多线程到底用来干什么?
java
阿里matlab建模师8 分钟前
【直流电机鲁棒控制】matlab实现H无穷大控制的直流电机鲁棒控制研究
开发语言·数学建模·matlab·全国大学生数学建模竞赛·美赛·科研项目
七夜zippoe10 分钟前
分布式事务性能优化:从故障现场到方案落地的实战手记(一)
java·分布式·性能优化
MediaTea17 分钟前
Python 第三方库:SymPy(符号计算工具)
开发语言·python·数学建模
qq_3564086617 分钟前
es通过分片迁移迁移解决磁盘不均匀问题
java·数据库·elasticsearch
他们都不看好你,偏偏你最不争气25 分钟前
【iOS】UIViewController
开发语言·macos·ios·objective-c·cocoa
青衫码上行34 分钟前
【从0开始学习Java | 第17篇】集合(中-Set部分)
java·学习
Pocker_Spades_A36 分钟前
Python快速入门专业版(二十二):if语句进阶:嵌套if与条件表达式(简洁写法技巧)
开发语言·python