主心骨:
一、Bean与BeanDefinition
1、全局掌握核心接口和类
解决了关键问题:
将对象之间的关系转而用配置来管理
- 依赖注入:依赖关系在Spring的IoC容器中管理
- 通过把对象包装在Bean中以达到管理对象和进行额外操作的目的
Bean是Spring的一等公民
2、Bean的定义
根据配置,生成用来描述Bean的BeanDefinition,常用属性:
- 作用范围scope(@Scope)
- 懒加载lazy-init(@Lazy):决定Bean实例是否延迟加载
- 首选promary(@Primary):设置为true的Bean会是优先的实现类
- factory-bean和factory-method(@Configuration和@Bean)
3、容器初始化主要做的事情
4、BeanDefinition家族成员
- RootBeanDefinition:不能为其他BeanDefinition的子类,否则设置parentName时会报异常
- GenericBeanDefinition:替代RootBeanDefinition,完全替代ChildBeanDefinition
5、简单容器
5.1、BeanFactory和FactoryBean的区别
BeanFactory:
- 获取FactoryBean实例
- IOC根接口
- 定义了如何从缓存中获取Bean实例
- applicationContext.getBean中参数beanName前加“&”获取的是FactoryBean实例,不加“&”获取的是FactoryBean.getObject()生成的bean实例 -->
FACTORY_BEAN_PREFIX
FactoryBean:
5.2、二级接口
5.2.1、ListableBeanFactory
5.2.2、HierarhicalBeanFacory
5.2.3、AutowireCapableBeanFactory
5.2.4、ConfigurableBeanFactory
5.2.5、ConfigurableListableBeanFactory
5.2.6、AbstractAutowireCapableBeanFactory
5.2.7、DefaultListableBeanFactory
6、复杂(高级)容器(上下文)
6.1、ApplicationContext常用容器
传统的基于XML配置的经典容器:
- FileSystemXmlApplicationContext:从文件系统加载配置
- ClassPathXmlApplicaionContext:从classpath加载配置
- XmlWebApplicationContext:用于Web应用程序的容器
目前比较流行的基于注解的容器:
- AnnotationConfigServletWebServerApplicationContext:boot模块下
- AnnotationConfigReactiveWebServerApplicationContext:响应式容器,boot模块下
- AnnotationConfigApplicationContext:web应用常使用
容器的共性:
- refresh()大致相同
7、Resource、ResourceLoader和容器之间的关系
7.1、根据资源自制自动选择正确的Resource
强大的加载资源的方式:
- 自动识别“classpath:”、“file:”等资源地址前缀
- 支持自动解析Ant风格带通配符的资源地址
7.2、ResourceLoader
实现不同的Resource加载策略,按需返回特定类型的Resource
7.3、BeanDefinitionReader
资源加在利器使用者
- 读取BeanDefinition
- BeanDefinitionRegistry
7.3.1、学习过程关键词
- location
- Resource
- ResourceLoader
- BeanDefinitionReader
- BeanDefinitionRegistry
- DefaultListableBeanFactory
7.4、BeanDefinition
8、容器初始化
8.1、后置处理器PostProcessor
本身也是一种需要注册到容器里的Bean
- 其里面的方法会在特定的时机被容器调用
- 实现不改变容器或者Bean核心逻辑的情况下对Bean进行扩展
- 对Bean进行包装、影响其行为、修改Bean的内容等
大类分为容器
级别的后置处理器以及Bean
级别的后置处理器
- BeanDefinitionRegistryPostProcessor
- BeanFactoryPostProcessor
BeanPostProcessor
8.2、Aware及其子接口
Aware(可感知的):
- 从Bean里获取到容器实例并对其进行操作