Spring IOC
- IOC = Inversion Of Control 控制反转。将设计好的对象放入容器,而不是在对象内部进行控制。
- 传统意义上,直接在对象内部创建对象,是程序主动依赖于对象。
- 然而,Spring有自己的容器,对象注册在容器中由Spring去管理对象的创建。
- 我自己认为控制反转是指,从”当前对象中去主动控制(实例化)对象“反转成“Spring容器去控制对象,当前对象是是被动的接受对象”
IOC有什么优点?
- IOC或依赖注入减少了应用程序的代码量。它使得应用程序的测试很简单,因为在单元测试中不再需要单例或JNDI查找机制。简单的实现以及较少的干扰机制使得松耦合得以实现。IOC容器支持勤性单例及延迟加载服务。
容器生命周期
- 初始化Bean
- 填充属性
- 调用BeanNameAware接口的setBeanName方法,设置bean的id
- 调用BeanFactoryAware接口的setBeanFactory方法,传递BeanFactory
- 调用ApplicationContextAware接口的setApplicationContext方法,传递ApplicationContext
- 调用BeanPostProcessor接口的PostProcessBeforeInitialization方法
- 调用InitializingBean接口的afterSetProperties方法
- 调用定制的init-method
- 调用BeanPostProcessor接口的PostProcessAfterInitialization方法
- 调用Disposable接口的Destory方法
- 调用定制的destory-method
实现
- 依赖注入
加载
- 获取配置文件资源
- 对获取的xml资源进行一定的处理检验
- 处理包装资源
- 解析处理包装过后的资源
- 加载提取bean并注册(添加到beanDefinitionMap中)
ApplicationContext
- EnvironmentCapable 获得Evironment
- ListableBeanFactory bean全部加载
- HierarchicalBeanFactory 载入多个继承关系的上下文
- MessageSource Spring国际化消息
- ApplicationEventPublisher 时间发送
- ResourcePatternResolve 获取资源
BeanFactory
懒加载bean
FactoryBean
实现Bean的代理,从BeanFactory.getBean(id)获得的对i想是FactoryBean.getObject()返回的对象
使用FactoryBean来定制实例化逻辑
使用BeanFactoryPostProcessor来自定义配置数据
使用BeanPostProcessor来定制bean
RequiredAnnotationBeanPostProcessor
AutowiredAnnotationBeanPostProcessor
CommonAnnotationBeanPostProcessor