bean的创建
获取类class
推断构造方法 @Autoware
创建一个普通对象
依赖注入 populateBean 把一些属性注入
初始化之前 @PostConstruct 注解 初始注入 实际可以用构造方法啊
初始化 initializationBean
1.判断是否有aware接口 invokeAwareMethods
2.执行 applyBeanPostProcessorsBeforeInitialization
3. 初始化方法 invokeInitMethods
4. applyBeanPostProcessorsAfterInitialization
getBeanPostProcessors() 数组不为空 里面有AbstractAutoProxyCreator 继承了procecss
初始化后 AOP
cglib生产代理对象
Spring 5.x中AOP默认依旧使用JDK动态代理
SpringBoot 2.x开始,AOP为了解决使用JDK动态代理可能导致的类型转换异常,而使用CGLIB。
在SpringBoot 2.x中,AOP如果需要替换使用JDK动态代理可以通过配置项spring.aop.proxy-target-class=false来进行修改,proxyTargetClass配置已无效。
放入concurrentHashMap
产生bean对象
1.bean 创建
2.spring 推断构造方法
在spring创建中,当出现多个构造方法时,如果没有默认构造方法,会出现报错
可以采用Autowawired实现指定对应的构造方法
或者
如果采用xml配置 也可以指定对应的构造方法
3.bean的获取
在缓存池中,存在一个currentHashMap 保存着bean
4.循环依赖
什么是循环依赖? bean A依赖B B依赖A
怎么解决? spring 三级缓存
什么是三级缓存
在Bean A创建 一般有这几个
创建A的实例
简单来说
就是 A 创建 填充B
B没有 去一级缓存找 。没有去二级缓存找 ,如果还没有 会调用三级缓存的操作
来创建一个代理对象或者普通对象, 填充
异步导致循环依赖错误
@Async 会产生代理对象
使用切面也会产生代理对象
spring mvc
如何理解boot中的start
就是一个减少配置的jar包 定义了一些初始化的bean来简化结构
配置都是在meta-inf/spring.factories 写入的配置