Spring loc容器加载过程
1.创建new applicationContext(解析配置---->扫描包----->BeanDefintion---->map
2.循环一个个判断:根据beanDefinition符合单例不是懒加载不是抽象3.BeanFactory.getBean生成bean象
4.先获取如果存在直接返回(单例)
5.没有获取到真正创建
6.实例化-->反射 无参构造函数
7.依赖注入
8.初始化-->初始化回调方法
9.put单例池(单例)缓存起来

spring aop和事务原理
事务也是通过动态代理实现,aop的动态代理是根据切点表达式判断是否满足条件,而事务是根据是否添加了@Transactional注解,有这个注解会进行对象的动态代理,然后在代理对象中执行try()catch(),对事务进行回滚或提交,Spring事务的代理对象执行某个方法时的步骤:
判断当前执行的方法是否存在@Transactional注解
如果存在,则利用事务管理器(TransactionMananger)新建一个数据库连接
修改数据库连接的autocommit为false
执行target.test(),执行程序员所写的业务逻辑代码,也就是执行sql
执行完了之后如果没有出现异常,则提交,否则回滚

多级缓存
只有一级缓存的情形
存在问题:锁粒度过大,影响性能,且无法降低锁的粒度。
只能在getBean这一入口加锁,因为锁只能包含一级缓存,不包含一级缓存,会导致获取的对象可能是不完整的
多线程并发,为了防止其他线程冲进来获取到不完整的bean对象,需要对缓存加锁,确保获取到的对象是完整的,由此,当c已经创建完毕,但是如果a和b存在循环依赖,对缓存锁住的情况,如果其他资源此时进来获取c,也会被堵在门外,影响性能

有二级缓存的情况
解决问题:降低一级缓存锁粒度,一级缓存性能问题
存在问题:aop动态带来是在初始化后进行的,假设a有aop动态代理,仅仅二级缓存会导致b中依赖的bean a和实际缓存中的bean 不一致,一个是原始bean,一个是动态代理之后的bean

有三级缓存情况
解决问题:循环依赖时原始对象和动态代理对象不一致的问题
注:理论上,二级缓存也能解决这个问题,只需要在实例化后添加判断,生成动态代理即可,但是循环依赖不一定发生,如果一上来就创建代理放进二级缓存,等于强行提前创建代理,破坏了spring正常的bean生命周期,因为这种可能出现的循环依赖,改变所有bean的代理时机,不符合原本设定的设计思想,所以需要三级缓存的ObjectFactory工厂,才能做到,在需要时才生成,生成唯一代理不影响正常流程

夜雨聆风