2)Bean 的完整生命周期 (十一步骤)了解内容, 但是对于 spring 内部操作理解有一定帮助
instantiate bean 对象实例化
populate properties 封装属性
如果 Bean 实现 BeanNameAware 执行 setBeanName
如果 Bean 实现 BeanFactoryAware 或者 ApplicationContextAware 设置工厂 setBeanFactory 或者上下文对象 setApplicationContext
如果存在类实现 BeanPostProcessor(后处理 Bean) , 执行 postProcessBeforeInitialization,BeanPostProcessor 接口提供钩子函数, 用来动态扩展修改 Bean(程序自动调用后处理 Bean)
- publicclassMyBeanPostProcessorimplementsBeanPostProcessor {
- publicObject postProcessAfterInitialization(Object bean, String beanName)
- throwsBeansException {
- System.out.println("第八步: 后处理 Bean,after 初始化");
- // 后处理 Bean, 在这里加上一个动态代理, 就把这个 Bean 给修改了
- return bean;// 返回 bean, 表示没有修改, 如果使用动态代理, 返回代理对象, 那么就修改了
- }
- publicObject postProcessBeforeInitialization(Object bean, String beanName)
- throwsBeansException {
- System.out.println("第五步: 后处理 Bean 的: before 初始化!!");
- // 后处理 Bean, 在这里加上一个动态代理, 就把这个 Bean 给修改了
- return bean;// 返回 bean 本身, 表示没有修改
- }
- }
注意: 这个前处理 Bean 和后处理 Bean 会对所有的 Bean 进行拦截
如果 Bean 实现 InitializingBean 执行 afterPropertiesSet
调用 < bean init-method="init"> 指定初始化方法 init
如果存在类实现 BeanPostProcessor(处理 Bean) , 执行 postProcessAfterInitialization
执行业务处理
如果 Bean 实现 DisposableBean 执行 destroy
? 调用 < bean destroy-method="customerDestroy"> 指定销毁方法 customerDestroy
5. 请介绍一下 Spring 框架中 Bean 的生命周期和作用域
(1)bean 定义
在配置文件里面用 < bean></bean > 来进行定义
(2)bean 初始化
有两种方式初始化:
A. 在配置文件中通过指定 init-method 属性来完成
B. 实现 org.springframwork.beans.factory.InitializingBean 接口
(3)bean 调用
有三种方式可以得到 bean 实例, 并进行调用
(4)bean 销毁
销毁有两种方式
A. 使用配置文件指定的 destroy-method 属性
B. 实现 org.springframwork.bean.factory.DisposeableBean 接口
- ## 作用域
- singleton
当一个 bean 的作用域为 singleton, 那么 Spring IoC 容器中只会存在一个共享的 bean 实例, 并且所有对 bean 的请求, 只要 id 与该 bean 定义相匹配, 则只会返回 bean 的同一实例
prototype
Prototype 作用域的 bean 会导致在每次对该 bean 请求 (将其注入到另一个 bean 中, 或者以程序的方式调用容器的 getBean() 方法) 时都会创建一个新的 bean 实例根据经验, 对所有有状态的 bean 应该使用 prototype 作用域, 而对无状态的 bean 则应该使用 singleton 作用域
request
在一次 HTTP 请求中, 一个 bean 定义对应一个实例; 即每次 HTTP 请求将会有各自的 bean 实例, 它们依据某个 bean 定义创建而成该作用 域仅在基于 web 的 Spring ApplicationContext 情形下有效
session
在一个 HTTP Session 中, 一个 bean 定义对应一个实例该作用域仅在基于 web 的 Spring ApplicationContext 情形下有效
global session
在一个全局的 HTTP Session 中, 一个 bean 定义对应一个实例典型情况下, 仅在使用 portlet context 的时候有效该作用域仅在基于 web 的 Spring ApplicationContext 情形下有效
来源: http://www.bubuko.com/infodetail-2490790.html