大白话让你了解Spring Bean 生命周期
创建Bean 流程:
initializeBean Bean 流程:
- @see BeanNameAware#setBeanName
- @see BeanClassLoaderAware#setBeanClassLoader
- @see BeanFactoryAware#setBeanFactory
- @see org.springframework.context.EnvironmentAware#setEnvironment
- @see org.springframework.context.EmbeddedValueResolverAware#setEmbeddedValueResolver
- @see org.springframework.context.ResourceLoaderAware#setResourceLoader
- @see org.springframework.context.ApplicationEventPublisherAware#setApplicationEventPublisher
- @see org.springframework.context.MessageSourceAware#setMessageSource
- @see org.springframework.context.ApplicationContextAware#setApplicationContext
- @see org.springframework.web.context.ServletContextAware#setServletContext
- @see org.springframework.beans.factory.config.BeanPostProcessor#postProcessBeforeInitialization
- @see InitializingBean#afterPropertiesSet
- @see org.springframework.beans.factory.support.RootBeanDefinition#getInitMethodName
- @see org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization
- @see org.springframework.beans.factory.config.DestructionAwareBeanPostProcessor#postProcessBeforeDestruction
- @see DisposableBean#destroy
- @see org.springframework.beans.factory.support.RootBeanDefinition#getDestroyMethodName
*/
public interface BeanFactory
何为IOC?
来自百度百科:
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
来自生活:
结婚要穿婚纱,怎么办?
我结婚,我去做个婚纱;你结婚,你去做个婚纱;结完婚,婚纱要么就丢掉;要么就在自己家保留;要有婚纱,得有纱布吧?得有各种bilingbiling 的装饰品吧?……自己做婚纱,麻烦又浪费。
于是,婚纱租赁公司应需而生,它致力于为这个城市所以的适龄新娘,创造出满意的婚纱。
这个婚纱的制作从新娘变成了婚纱租赁公司~~
所以这个婚纱店怎么设计的呢?(注意扩展点)
- 大老板发了调查问卷,于是规划了一批基础的婚纱(开发人员按照框架设计,定义自己要加载的Bean ; 大老板派Reader 部门的人去整理一下都需要什么样子的婚纱,然后生成婚纱订单(BeanDefinition))
- 在做之前,发现少统计了一批特殊人群 婚纱订单,怎么办哇?他用了一个叫做(BeanDefinitionRegistryPostProcessor)的工具,把少的那部分也放到订单里面去;
- 为了兼容不同地区不同人的特征,有个老板的调查问卷婚纱码,用的占位符${size} , 然后自己要自己去调查了下合适的size填充进去,他是怎么做的呢?他用了一个叫做(BeanFactoryPostProcessor )的工具去做的;
- 把要做婚纱的订单梳理好了,开始做婚纱吧?有些婚纱做之前需要先有一堆扣子;做之后,还需要干洗;怎么做到呢?那你的婚纱在定义的时候,自己说明下吧,于是你用了一个叫做(BeanPostProcessor)的工具去做的;
- 有一些婚纱,做的时候,要特殊处理下,不能像其他的婚纱一样做,于是用了一个叫(InitializingBean)的工具,自己说明该怎么做这个婚纱,防止做的不太美观;
- 有一些婚纱,对环境有污染,销毁时候要注意,得特殊处理;于是他用了一个叫做(DisposableBean)的工具,告诉婚纱租赁店怎么销毁;
Bean 的生命周期描述
- [ 准备] Reader 部门的人先去梳理需要做的婚纱 [生成BeanDefinition ];
- [ 准备] 去看看有没有对婚纱订单特殊处理的诉求(对BeanFactoryPostProcessor 和 BeanDefinitionRegistryPostProcessor)的处理,修改BeanDefinition;
- [ 创建-实例化] 先拿到这个婚纱的设计,把它最后要放在哪里,它的预算,先安排好(newInstance);
- [创建-分析都需要哪些材料,然后安排起来] (populateBean);
- [创建- 预处理] (看有没有Aware )
- [创建- 预处理]看有没有需要提前先做的事(解析BeanPostProcessor)
- [创建- 初始化] 看下有没有特殊的初始化要求,有的话执行(对 InitializingBean 的解析)
- [创建- 处理后]看有没有需要做好衣服需要干的事(解析BeanPostProcessor)
- 开始使用婚纱;
…… - N久之后,婚纱销毁,看下有没有特殊的要求,有的话,就按照要求销毁(对 DisposableBean 的处理)
创建Bean
- BeanFactory 和 ApplicationContext
几个学习点
设计模式:
a. 工厂模式:
b. 委托模式:
c. 单例模式
d. 策略模式
e. 装饰者模式
3. 扩展:
钩子与模板类的有效使用;