Spring- 技术专题 -Bean 的生命周期简介
Spring的生命周期从宏观的角度去看,它的生命周期可以分为4个阶段:实例化、属性赋值、初始化、销毁,
细化Bean的生命周期为:
- 实例化 :通过反射进行构建相关的实例对象以及生命周期的开启阶段,进行相关的内存分配。
- 设置属性值(依赖注入Setter):设置相关的对象的基本属性和相关的信息方法调用。
- 如果Bean实现了BeanNameAware接口,则会去调用它的setBeanName(String beanId),传递Spring配置中Bean的ID.
- 如果Bean实现了BeanFactoryAware接口,则会去调用它的setBeanFactory()方法,传递工厂本身
- 如果Bean实现了ApplicationContextAware,调用setApplicationContext(ApplicationContext)方法。
- 如果Bean实现了BeanPostProcessor接口,调用方法postProcessBeforeInitialization(Object obj, String s),这是一个容器级生命周期接口方法,它独立于Bean,容器附加装置的形式注册到Spring容器中,当Spring容器创建Bean的时候,这中“后处理器”都会发生作用,影响性是全局的。
- 如果Bean实现了InitializingBean接口,则调用它所实现的afterPropertiesSet()方法
- 调用通过init-method属性配置的初始化方法
- 如果关联了BeanPostProcessor接口,将会调用postAfterInitialization(Object obj, String s)方法
- 当Bean不再使用的时候,会进行销毁。如果Bean实现了DisposableBean,则调用它所实现的afterPropertiesSet()方法。
- 调用通过destroy-method属性配置的销毁方法.
Spring框架的核心功能是控制反转IOC,面向切面AOP和声明式事务等功能,这些功能都依赖于IOC实现的基础上。IOC:就是通过容器来控制业务对象之间的依赖关系,这就是"控制反转"的含义,控制权由应用代码转到了外部容器,控制权发生了转移,这样一来,既可降低代码模块间的耦合度。
为实现IOC功能,Spring提供了两个访问接口:BeanFactory和ApplicationContext
BeanFactory:Bean工厂,借助于配置文件可以实现对JavaBean的配置和管理,用于向使用者提供Bean的实例。
完成容器管理对象的实例化,并根据预定的配置完成对象之间的依赖关系的组装,最终向使用者提供已完成装配的可用对象。常用的方法有:
boolean containsBean(String name)
Object getBean(String name)
Object getBean(String name,Class requiredType)
Class getType(String name)。
ApplicationContext:构建在BeanFactory基础上,提供了更多的实用功能:
(1)MessageSource:为应用提供国际化访问功能。
(2)ResourceLoader:提供资源(URL,文件系统)的访问支持,根据资源的地址判断资源的类型,并返回对应的Resource实现类。
(3)ApplicationEventPublisher:引入了事件机制,包括启动事件,关闭事件等,让容器在上下文中提供了对应用事件的支持。
简单了解了BeanFactory和ApplicationContext后,我们来看看两者之间的区别:
BeanFactory在初始化容器时,并未实例化Bean,直到第一次访问某个Bean时才实例化目标Bean.而ApplicationContext在初始化用上下文时,就实例化所有单实例的Bean,因此ApplicationContext的初始化事件比BeanFactory稍长一些,但程序后面获取Bean实例时将直接从缓存中调用,因此具有较好的性能。