IOC原理
IOC(inversion of control):控制反转
- Spring Core最核心部分
- 依赖注入(Dependency Inversion)
DI:把底层类作为参数传递给上层类,实现上层对下层的“控制”
依赖注入的方式
- Setter
- Interface
- Constructor
- Annotation
依赖倒置原则,IOC,DI,IOC容器的关系
IOC容器的优势
- 避免在各处使用new来创建类,并且可以做到统一维护
- 创建实例的时候不需要了解其中的细节
Spring IOC
功能
- 依赖注入
- 依赖检查
- 自动装配
- 支持集合
- 指定初始化方法和销毁方法
- 支持回调方法
核心接口
- BeanFactory
- ApplicationContext
BeanDefinition
主要用来描述bean的定义
BeanDefinitionRegistry
提供向IOC容器注册BeanDefinition对象的方法
BeanFactory
提供IOC的配置机制
包含Bean的各种定义,便于实例化Bean
建立Bean之间的依赖关系
Bean生命周期的控制
BeanFactory 与 ApplicationContext 的比较
- BeanFactory 是 Spring 框架的基本设施,面向Spring
- ApplicationContext面向使用Spring框架的开发者
ApplicationContext的功能
- BeanFactory:能够管理、装配bean
- ResourcePatternResolver:能够加载资源文件
- MessageSource:能够实现国际化等功能
- ApplicationEventPublisher:能够注册监听器,实现监听机制
@Autowired 和 @Resource区别
前者会优先以名字去寻找对应的bean,通常是与bean相同的名字但是首字母是小写
后者优先以类型去寻找对应的bean
如果类型和名字都相同可以使用@Primary
在bean中声明,首选此bean,或是用@Qualifier
在需要注入的bean中指向需要的bean
getBean方法的代码逻辑
- 转换beanName
- 从缓存中加载实例
- 实例化Bean
- 检测parentBeanFactory
- 初始化依赖Bean
- 创建Bean
Sping Bean的作用域
- singleton:Spring的默认作用域,容器里拥有唯一的Bean实例,适合无状态的bean
- prototype:针对每个getBean请求,容器都会创建一个Bean实例,适合有状态的bean(创建时需要三思:多次创建和销毁bean会产生明显的开销)
如果是web容器还支持以下三种
- request:会为每个Http请求创建一个Bean实例
- session:会为每个session创建一个Bean实例
- globalSession:会为每个全局Http Session创建一个Bean实例,该作用域仅对Portlet(使用PortletContext时有效)有效(Protlet 是一种运行时环境)
生命周期
销毁过程
- 如果实现了DisposableBean接口,则会调用destroy方法
- 如果配置了destry-method属性,则会调用其他配置的销毁方法