Spring学习笔记五

Bean的生命周期

原文:http://997004049-qq-com.iteye.com/blog/1729793

任何一个事物都有自己的生命周期,生命的开始、生命中、生命结束。大家最熟悉的应该是servlet 的生命周期吧。和 servlet 一样 spring bean 也有自己的生命周期。本文讲述 spring bean 的生命周期,这个对理解 spring 框架有非常好的作用。

大家应该知道spring 中有几种供 springbean 生存的容器: BeanFactory 、 ApplicationContext 、 webApplicationContext 。由于 ApplicationContext 和 webApplicationContext 基本一样。所有这里就只介绍 BeanFactory 和 ApplicationContext 。

  理解springBean 的生命周期主要通过两个层面来理解。其一是 Bean 的作用范围,其一是实例化 Bean 时所经历的一系列阶段.

1.BeanFactory

下图描述了BeanFactory中bean的完整生命周期:

1. 当调用者通过 getBean( name )向 容器寻找Bean 时,如果容器注册了 org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor接口,在实例 bean 之前,将调用该接口的 postProcessBeforeInstantiation ()方法,

2. 根据配置情况调用 Bean构造函数或工厂方法实例化 bean

3. 如果容器注册了 org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor接口,在实例 bean 之后,调用该接口的 postProcessAfterInstantiation ()方法,可以在这里对已经实例化的对象进行一些装饰。

4. 受用依赖注入,Spring 按照 Bean 定义信息配置 Bean 的所有属性 ,在设置每个属性之前将调用 InstantiationAwareBeanPostProcess接口的 postProcessPropertyValues ()方法 。

5 .如果 Bean 实现了 BeanNameAware 接口,工厂调用 Bean 的 setBeanName() 方法传递 Bean 的 ID 。

6 .如果 Bean 实现了 BeanFactoryAware 接口,工厂调用 setBeanFactory() 方法传入工厂自身。

7 .如果 BeanPostProcessor 和 Bean 关联,那么 将调用该接口 的postProcessBeforeInitialzation() 方法 对 bean进行加工操作,这个非常重要, spring 的 AOP 就是用它实现的。

8. 如果bean 实现了 InitializingBean 接口,将调用 afterPropertiesSet ()方法

9 如果Bean 指定了 init-method 方法,它将被调用。

10 如果有BeanPsotProcessor 和 Bean 关联,那么它们的 postProcessAfterInitialization() 方法将被调用。 到这个时候, Bean 已经可以被应用系统使用了  。

11. 如果在<bean> 中指定了该 bean 的作用范围为 scope="prototype", 将 bean 的调用者,调用者管理该 bean 的生命周期, spring 不在管理该 bean 。

12. 如果在<bean> 中指定了该 bean 的作用范围为 scope="singleton", 则将该 bean 放入 springIOC 的缓存池中,将触发 spring 对该 bean 的生命周期管理。

13. 有两种方法可以把它从Bean Factory 中删除掉 :

1.如果 Bean 实现了 DisposableBean 接口, destory() 方法被调用。

2.如果指定了订制的销毁方法,就调用这个方法。

总结:

Bean的完整生命周期从 spring 容器开始实例化 bean 开始,到销毁。可以从三点来理解

1、 bean自身的方法:包括构造方法、 set 方法、 init-method 指定的方法、 destroy-method 指定的方法

2、 Bean级生命周期接口方法:如 BeanNameAware 、 BeanFactoryAware 等这些接口方法由 bean类实现。

3、 容器级生命周期接口方法:上图中带星的。有InstantiationAwareBeanPostProcessor 、 BeanPostProcessor 等。一般称为后处理 器。他们一般不由bean 本身实现,独立存在,注册到 spring 容器中。 Spring 通过接口反射预先知道,当 spring 容器创建任何 bean 时,这些后处理器都会发生作用。所以他们是全局的,用户可以通过编码对只感兴趣的 bean 进行处理。

Bean级生命周期接口和容器级生命周期接口是个性和共性辩证统一的思想,前者解决 bean 的个性化处理问题,而后者解决容器中某些 bean 共性化处理问题

2.ApplicationContext

下图描述了ApplicationContext中bean的生命周期:

  通过上图很容易发现其实应该上下文和BeanFactory 只是多了一个接口, 如果Bean 实现了 ApplicationContextAwre 接口, setApplicationContext() 方法被调用。

还有如果配置文件中生明了工厂后处理器接口 BeanFactoryPostProcessor的实现类,则应用上下文在装配配置文件之后初始化 bean 之前将调用该接口对配置信息进行加工。还有应该上下文的这些后处理器只要和普通的bean 一样配置在 spring 配置文件中就行了,不需要事先声明。

时间: 2024-08-27 22:18:30

Spring学习笔记五的相关文章

Spring学习笔记五: AOP入门

一.AOP术语 切面(aspect):要实现的交叉功能,是系统模块化的一个切面或领域.如日志记录. 连接点:应用程序执行过程中插入切面的地点,可以是方法调用,异常抛出,或者要修改的字段. 通知:切面的实际实现,他通知系统新的行为.如在日志通知包含了实 现日志功能的代码,如向日志文件写日志.通知在连接点插入到应用系统中. 切入点:定义了通知应该应用在哪些连接点,通知可以应用到AOP框架支持的任何连接点. 引入:为类添加新方法和属性. 目标对象:被通知的对象.既可以是你编写的类也可以是第三方类. 代

Spring学习笔记五(JDKProxy和cglibProxy的区别)

1.前言 上一篇博客讲解了一下Spring中的AOP,而这篇博客来剖析下Spring实现AOP的两种机制:JDKProxy和cglibProxy两种动态代理  2.JDKProxy动态代理 JDK动态代理,为接口实现的对象创建代理.具体详见源码. <span style="font-family:SimSun;font-size:18px;">package com.test; import java.lang.reflect.InvocationHandler; impo

Caliburn.Micro学习笔记(五)----协同IResult

Caliburn.Micro学习笔记(五)----协同IResult 今天说一下协同IResult 看一下IResult接口 /// <summary> /// Allows custom code to execute after the return of a action. /// </summary> public interface IResult { /// <summary> /// Executes the result using the specif

Spring学习笔记(一)

Spring学习笔记(一) Spring核心思想: IOC:  Inversion Of Control (控制反转) / DI: Dependency Injection (依赖注入) AOP: Aspect Oriented Programming (面向切面编程) IOC 1. 简单的应用 Model package com.wangj.spring.model; public class User { private String username; private String pas

不错的Spring学习笔记(转)

Spring学习笔记(1)----简单的实例 ---------------------------------   首先需要准备Spring包,可从官方网站上下载.   下载解压后,必须的两个包是spring.jar和commons-logging.jar.此外为了便于测试加入了JUnit包.   在Myeclipse中创建Java项目.   编写一个接口类,为了简单,只加入了一个方法.   Java代码   1.package com.szy.spring.interfacebean;  

angular学习笔记(五)-阶乘计算实例(1)

<!DOCTYPE html> <html ng-app> <head> <title>2.3.2计算阶乘实例1</title> <meta charset="utf-8"> <script src="../angular.js"></script> <script src="script.js"></script> </

NLTK学习笔记(五):分类和标注词汇

[TOC] 词性标注器 之后的很多工作都需要标注完的词汇.nltk自带英文标注器pos_tag import nltk text = nltk.word_tokenize("And now for something compleyely difference") print(text) print(nltk.pos_tag(text)) 标注语料库 表示已经标注的标识符:nltk.tag.str2tuple('word/类型') text = "The/AT grand/J

Linux System Programming 学习笔记(五) 进程管理

1. 进程是unix系统中两个最重要的基础抽象之一(另一个是文件) A process is a running program A thread is the unit of activity inside of a process the virtualization of memory is associated with the process, the threads all share the same memory address space 2. pid The idle pro

《Spring学习笔记》:Spring、Hibernate、struts2的整合(以例子来慢慢讲解,篇幅较长)

<Spring学习笔记>:Spring.Hibernate.struts2的整合(以例子来慢慢讲解,篇幅较长) 最近在看马士兵老师的关于Spring方面的视频,讲解的挺好的,到了Spring.Hibernate.struts2整合这里,由于是以例子的形式来对Spring+Hibernate+struts2这3大框架进行整合,因此,自己还跟着写代码的过程中,发现还是遇到了很多问题,因此,就记录下. 特此说明:本篇博文完全参考于马士兵老师的<Spring视频教程>. 本篇博文均以如下这