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了

总结:





16万+





