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了
总结: