Spring——核心
Spring——核心
Spring关键策略
- 基于POJO的轻量级和最小侵入性编程
- 通过依赖注入和面向接口实现松耦合
- 基于切面和惯例进行声明式编程
- 通过切面和模板减少样板式代码
Spring容器
- BeanFactory
- ApplicationContext
区别:
- BeanFactory在加载Bean的时候是延迟加载,需要时才加载(不能及时发现问题)而ApplicationContext默认是初始化容器时加载Bean,若bean的scope属性为prototype且lazy-init为false(默认)则为使用时加载
- ApplicationContext接口由BeanFactory接口派生而来,提供了BeanFactory所有的功能
- BeanFactory无法支持AOP,WEB应用等
- ApplicationContext还提供以下功能:
- MessageResource国际化的消息访问(i18n)
- 资源访问,如URL和文件
- 事件传播
- 载入多个(有继承关系)上下文,使得每个上下文专注于一个特定的层次,比如应用的web层
Bean生命周期
1. Spring对bean进行实例化
2. Spring将值和bean的引用注入到bean对应的属性中
3. 如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBeanName()方法
4. 如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将bean容器实例注入
5. 如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用注入进来
6. 如果bean实现了BeanPostProcessor接口,Spring将调用他们的postProcessBeforeInitialization()方法
7. 如果bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet()方法。类似地,如果bean使用init-method声明了初始化方法,该方法也会被调用
8. 如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessAfterInitialization()方法
9. 此时,bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁
10. 如果bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用