IOC( Inversion of Control):控制反转
- Spring Core 最核心的部分
- 依赖注入( Dependency Inversion )
依赖注入的方式
- Set注入:Setter
- 接口注入:Interface
- 构造函数:Constructor
- 注解:Annotation
优势
- 避免在各处使用new来创建类,并且可以做到统一维护
- 创建实例的时候不需要了解其中的细节
应用
流程
- 读取Bean配置信息
- 根据Bean注册表实例化Bean
- 将Bean实例放到Spring容器中
支持的功能
- 依赖注入
- 依赖检查
- 自动装配
- 支持集合
- 指定初始化
核心接口
- BeanFactory:顶级容器接口
- ApplicationContext
BeanDefinitionRegistry
提供向IOC容器注册BeanDefinition对象的方法
BeanFactory:Spring框架最核心的接口
- 提供IOC的配置
- 包含Bean的各种定义,便于实例化Bean
- 建立Bean之间的依赖关系
- Bean生命周期的控制
BeanFactory体系结构
- BeanFactory:顶级容器接口
- ListableBeanFactory:定义了访问容器中Bean基本信息的若干方法。如:查看Bean的个数,获取某一类型Bean的配置名,查看容器中是否包含某一Bean
- HierarchicalBeanFactory:父子集联IOC容器接口,子容器可以通过方法访问父容器,父容器不能访问子容器Bean,例:MVC中展现层的Bean位于一个子容器中,而业务层、持久层的Bean位于父容器,展现层可以引用业务层、持久层的Bean,业务层看不到展现层的Bean
- ConfigurableBeanFactory:增强了IOC容器的可定制性,定义了设置类型装载器,属性编辑器,属性初始化后置处理器
- AutoWireCapableBeanFactory:定义了容器中的Bean按某种规则,如按名称,类型等自动装配
- SingletonBeanRegistry:允许在运行期间向容器注册Singleton实例Bean的方法
BeanFactory与ApplicationContext的比较
- BeanFactory是Spring框架的基础设施,面向Spring
- ApplicationContext面向使用Spring框架的开发者
ApplicationContext的功能( 继承多个接口 )
- BeanFactory:能够管理、装配Bean
- ResourcePatternResolver:能够加载资源文件
- MessageSource:能够实现国际化等功能
- ApplicationEventPublisher:能够注册监听器,实现监听机制
IOC的getBean方法
- 转换BeanName
- 从缓存中加载实例
- 实例化Bean
- 检测parentBeanFactory
- 初始化依赖的Bean
- 创建Bean
Spring Bean的作用域
- singleton:Spring的默认作用域,容器里拥有一个唯一的Bean实例
- prototype:针对每一个getBean请求,容器都会创建一个Bean实例
- request:会为每个Http请求创建一个Bean实例
- session:会为每个session创建一个Bean实例
- globalSession:会为每个全局Http Session创建一个Bean实例,对该作用域仅对Portlet有效
创建过程
- 实例化Bean
- Aware(注入Bean ID、BeanFactory和AppCtx)
- BeanPostProcessor(s).postProcessBeforeInitialization
- InitializingBean(s).afterPropertiesSet
- 定制的Bean init方法
- BeanPostProcessor(s).postProcessAfterInitialization
- Bean初始化完毕
销毁过程
- 若实现了DisposableBean接口,则会调用destroy方法
- 若配置了destry-method属性,则会调用其配置的销毁方法