框架篇面试题

1、单例bean是线程安全的吗?

不是线程安全的

注意点:在类中的成员变量尽量不要定义可修改的变量,尽量用static final 进行修饰

总结:

2、Spring AOP

事务的实现方式

切面类:

在某个方法上加注解:

@Log注解的定义:

总结:

3、事务失效的场景

总结:

4、bean的生命周期

BeanDefinition:

示例说明:

BeanPostProcessor 后置处理器接口,可以看到,在这里的实现方式是自定义了一个MyBeanPostProcessor类,实现BeanPostProcessor接口,任何类都在初始化前都需要执行postProcessBeforeInitialization()方法,在初始化完了之后都需要执行postProcessAfterInitialization()方法

初始化方法:

重写afterPropertiesSet()方法

第六步:销毁方法

配置类:

测试类:

执行结果:

可以看到执行顺序和图示一样

销毁方法没有执行,因为没有把容器关了

演示在BeanPostProcessor#after 后置处理器中写了一段代码 实现AOP 增强

Enhancer是cglib中的一个对象

这段增强是使用的cglib增强,本身处理执行原本的逻辑外不做其他操作

当类是User类时,返回代理对象

当类不是User类时,返回本身的对象

结果显示:

user对象是通过cglib生成的代理对象

总结:

后置处理器:一共有两个 BeanPostProcessor#before   BeanPostProcessor#after

bean的依赖注入通常是使用它的set方法进行注入的。

5、bean的依赖循环(循环引用)

循环依赖问题:

Spring框架已经帮我们解决了大部分循环依赖问题:

一级缓存解决不了循环依赖的问题:

一级缓存和二级缓存一起能解决循环依赖的问题吗?可以的

一级缓存和二级缓存能够解决一般对象的循环依赖问题,如果对象被增强了,那么就解决不了,这里就需要引入三级缓存进行解决了

引入三级缓存示意图:

对象工厂的作用就是帮你生成对象或者生成代理对象 

把A的对象工厂,也就是可以生成A的工厂类放到三级缓存中

把通过A的工厂对象生成A的代理对象,目前还是个半成品,放到二级缓存中

 B对象创建成功之后,将B对象放到一级缓存单例池中,同时清空三级缓存中的B的工厂对象 

B对象生成后,就可以生成A对象,生成的是A的代理对象,放到一级缓存中,然后清空二级缓存中的A的半成品对象。

也有Spring框架解决不了的循环依赖问题:

构造方法中调用,使用@Lazy注解,什么时候要用到,什么时候去注入 

总结:

在这里使用二级缓存的作用:

1、因为我们的对象都是单例的,创建B时需要的A必须从二级缓存中获取

2、B创建成功,创建A时也从二级缓存中拿,如果多次调用对象工厂可能会产生多例,处理起来可能更麻烦

构造方法出现了循环依赖怎么解决:

6、SpringMVC执行流程

3中的执行链:可能是包含拦截器,不是直接到handler的,所以返回的是处理器执行链

1、找到handler执行2、处理handler中方法上方法的转换和返回值的处理

JSP:

前后端分离开发:

更简单了,没有了ModelandView了

总结:

7、SpringBoot自动配置原理

8、Spring框架常见的注解

9、MyBatis执行流程

10、MyBatis延迟加载使用及原理

11、MyBatis一级、二级缓存

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值