spring
1.手动注入方式
构造器注入
setter注入:
方法+@Autowired
实现BeanFactoryPostProcessor 接口并逐个添加类(无法统一配置)后置处理器,当扫描完成后调用
setAutowireMode方法完成依赖的注入自身需要是个bean
2.自动注入模型
xml配置
no
bytype
byname
constructor
3.抽象@Autowired @Resource
I. AutowiredAnnotationBeanPostProcessor 先通过type找没有的话 然后通过name找
先通过type找到2个 通过name找
使用field.set
属于setter的变体
II.CommonAnnotationBeanPostProcessor先通过name找 再通过type找
4.spring一个对象被spring初始化就执行某些逻辑 生命周期回调
//单例 先构造器
I. @PostConstruct注解
II. 实现初始化bean接口 重写方法
III.xml方式配置的init-method方法
//原型 需要使用getbean方法 顺序和前面一样
//单例懒加载 效果与原型一致
顺序基于spring生命周期 -> 先拿到后置处理器处理注解 -> init-method方法 方法里面依次调用接口方法和xml配置
5.factoryBean和普通Bean
I. 初始化时机不同
II.存放位置不同
III.factoryBean既可以生成Bean放到spring容器中,同时自己也是个bean factoryMethod所在的类不是bean
6.如何将一个对象放到spring中
I. 实现factoryBean接口
II. 使用@Bean注解
III.ac.getBeanFactory().registerSingleton(xxxx);//鸡肋
仅仅把一个裸对象放到spring容器中没有意义
无法依赖ac.register(xx)对象,除非先注册自己的bean后注册configuration Bean
该对象被其他对象引用才会放到spring容器中->其他对象 1.本身就存在于spring容器中 2.
7.使用@Configuration
获取的对象变成代理对象,用来保证里面的bean是单例
8.beanDefination
手动添加bd:
实现BeanDefinationRegistryPostProcessor
获取BeanDefinationRegistry对象setBeanClass
存放bean属性的对象
RootBeanDefinition:作为父bd、真实bd出现、不能作为子bd出现
通过可更改bean属性
ChildBeanDefinition:不能作为直接父、普通bd出现 如果属性相同可继承父bd
会继承父bd的属性
GenericBeanDefinition:可以替代Childrenbd
不能替代root?
9.生命周期
I. 扫描:将spring自身需要的bean实例化 (reader方法)
环境初始化
解析类(spring内部后置处理器) 解析成beanDefination 放入 beanDefinationMap
II. 执行后置处理器(spring的、自定义的)修改beandefination属性 然后更新:
调用beanfactory后置处理器实现自定义的后置处理器
III. 验证 判断哪些能实例化(lazy,prototype,dependson注解->先实例化需要的对象)
IV. 推断构造方法 --推断构造方法委托给kotlin
都满足 == 都不满足 ->返回空,调用无参
V. 反射通过反射实例化一个对象
VI. 缓存注解信息,解析合并后的bd对象
VII. 提前暴露一个工厂
VIII.判断是否需要完成属性注入
IX. 完成属性注入
X. 回调Aware接口
XI. 调用生命周期回调方法
XII. 完成aop代理
XIII.实例化可以实例化的bean到单例池
XIV. 手动实例化bean(getBean)
XV. 销毁该对象
10.容器关闭之前调用某个方法
I. @PreDestroy
II. 后置处理器 设置destory方法(close)
11.新老mybatis对比
老:通过mapperscan扫描出接口生成代理对象 将代理对象解析成beandefinition 通过spring的后置处理器 放到spring beandefinationmap中
新:实现bd注册后置处理器后,把MapperScannerConfigurer放到bdMap中该类实现了bd注册后置处理器-->new了一个mapper扫描类(实例化扫描器)->通过扫描器扫描mapper转换成bd
12.循环依赖
默认支持循环依赖--判断是否支持循环依赖(AbstractAutowireCapableFactory)--
必须是单例
可以关闭循环依赖setAllowCircularReferences(false)
流程: A依赖B B依赖A 以A为例
spring先扫描是否支持循环依赖,把循环依赖的对象
A创建bean时发现依赖B(需要注入),此时去创建B,创建B时发现需要注入A,于是调用getSingleton方法开始去单例池中获取A,此时单例池中不存在A,也不是正在被创建,返回空。
dogetbean() 得到空的bean,进行一系列验证(原型、单例、依赖),调用一个重载的getSingleton方法,此时一个ObjectFactory接口传到了getsingleton方法中,再从单例池中获取,获取为空开始创建,往一个集合中表示正在创建
此时getsingleton的createbean --docreatebean 此时A在三级缓存 暴露一个工厂让AOP提前完成代理,B不存在 --populatebean--执行bean实例化后置感知器,A在二级缓存--判断注入模型--将B放入单例池中,B获得了一个simpleA,A处于二级缓存--B又去循环填充,当populate完成时B循环填充完成 --执行到getBean--getsingleton--此时发现A正在被创建,通过暴露工厂,给B一个简单A,将B放入容器,注入到A,
注册一次性bean
A初始话过后,将A从二级缓存转移到一级缓存,此时B已经实例化好了 B直接getBean 单例bean实例化完成
13.设计模式
代理模式
工厂模式
策略模式:调用bean工厂后置处理器 判断我们提供的是父接口还是子接口,根据不同的接口执行不同的方法
执行bean后置处理器--属性注入时获取所有bean后置处理器
14.抽象类
提供模板让子类继承,符合其规约
15.扩展点
BeanFactoryPostProcessor 用来包装bd属性 bd需要已经存在
BeanDefinitionResgistryPostProcessor(接口)可用来添加bd 还有BeanDefinitionRegistry对象
ImportBeanDefinitionRegistrar
16.beanPostProcessor bean后置处理器
beanfactoryPostProcessor干预初始化过程,包括注册bd,修改bd属性
beanPostProcessor干预实例化过程
InstantiationAwareBeanPostProcessor管理bean要不要实例化:
ApplicationContextAwareProcessor
ConfigurationClassPostProcessor
PostProcessorRegistrationDelegate
CommonAnnotationBeanPostProcessor
ApplicationListenerDetector
AutowireAnnotationBeanPostProcessor
AnnotationAwareAspectjAutoProxyCreator
17.AOP
什么时候产生代理:
初始化
实例化:
实例化之前--doCreateBean之前--resolveBeforeInstantiation--判断要不要做代理
实例化中 --createBeanInstance--determineConstructorsFromBeanPostProcessors--第二次
--doCreateBean--applyMergedBeanDefinitionPostProcessors--第三次
--addSingletonFactory -> getEarlyBeanReference; 第四次 通过上面bean后置处理器完成属性注入
- 代理
AOP中使用了代理
在使用@Configuration 用来判断是否是一个全注解类,如果是全注解类将会使用cglib对该类进行代理(保证单例核心思想)
静态代理:
继承
聚合
动态代理: 动态生成java类 然后编译加载
jdk代理:接口代理 产生代理快,执行慢
cglib代理:继承代理 产生代理慢,执行快
容器流程
初始化各种集合
reader 读取AnnotationConfigApplicationContext
初始化beanFactory
scanner
register(Class<?>... annotatedClasses) 读取componentscan注解的类 扫描出了AppConfig
refresh方法
进入时获得6个bd,包括appConfig
// 准备刷新的上下文
prepareRefresh()
//进行了一次cas操作判断dean工厂创建成功没有,并序列化id
obtainFreshBeanFactory
//感觉啥也没干
prepareBeanFactory(beanFactory)
//子类覆盖实现 感觉啥也没干 //扫描出@Component注解属性
postProcessBeanFactory(beanFactory);
//找到实现BeanFactoryPostProcessor接口的方法,并将相关BeanFactory(Registry)PostProcessor的实现类放入单例池
invokeBeanFactoryPostProcessors
//初始化单例
finishBeanFactoryInitialization(beanFactory);
{
//初始化非延迟加载的单例
preInstantiateSingletons();
{
//DefaultListableBeanFactory
getBean;
{
//AbstractBeanFactory getBean doGetBean
第二个getsingleton执行创建
//AbstractAutowireCapableBeanFactory -- createBean --doCreateBean --
createBeanInstance
{
推断构造方法
determineConstructorsFromBeanPostProcessors
}
//获取实例对象
instanceWrapper.getWrappedInstance()
//判断是不是单例并是否支持循环依赖
//第四次调用后置处理器 暴露工厂 获取一个简单A(介于BeanDefinition 和 bean之间)
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
//获取依赖对象,进入对象填充
//将A放入单例池(一级缓存),删除3级(没有),删除2级,放入注册单例
populateBean(beanName, mbd, instanceWrapper);
//主要是aop代理装配对象
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
}