Spring Ioc 容器
4.1 Bean 作用域
Spring 框架支持以下五个作用域,如果你使用 web-aware ApplicationContext 时,其中三个是可用的。
作用域 | 描述 |
---|---|
singleton | 在 spring IoC 容器仅存在一个 Bean 实例,Bean 以单例方式存在,默认值 |
prototype | 每次从容器中调用 Bean 时,都返回一个新的实例,即每次调用 getBean() 时,相当于执行 newXxxBean() |
request | 每次 HTTP 请求都会创建一个新的 Bean,该作用域仅适用于 WebApplicationContext 环境 |
session | 同一个 HTTP Session 共享一个 Bean,不同 Session 使用不同的 Bean,仅适用于 WebApplicationContext 环境 |
global-session | 一般用于 Portlet 应用环境,改作用于仅适用于 WebApplicationContext 环境 |
4.2 Bean 的生命周期
在传统的 Java 应用中,bean 的生命周期很简单。使用 Java 关键字 new 进行 bean 实例化,然后该 bean 就可以使用了。一旦该 bean 不再被使用,则由 Java 自动进行垃圾回收。
相比之下,Spring 容器中的 bean 的生命周期就显得相对复杂多了。正确理解 Spring bean 的生命周期非常重要,因为你或许要利用 Spring 提供的扩展点来自定义 bean 的创建过程。下图展示了 bean 装载到 Spring 应用上下文中的一个典型的生命周期过程。
bean 在 Spring 容器中从创建到销毁经历了若干阶段,每一阶段都可以针对 Spring 如何管理 bean 进行个性化定制
正如你所见,在 bean 准备就绪之前,bean 工厂执行了若干启动步骤。我们对上图进行详细描述:
Spring 对 Bean 进行实例化;
- 相当于程序中的 new Xx()
Spring 将值和 Bean 的引用注入进 Bean 对应的属性中;
如果 Bean 实现了 BeanNameAware 接口 ,Spring 将 Bean 的 ID 传递给 setBeanName() 方法
- 实现 BeanNameAware 清主要是为了通过 Bean 的引用来获得 Bean 的 ID,一般业务中是很少有在 Bean 的 ID 的
如果 Bean 实现了 BeanFactoryAware 接口 ,Spring 将调用 setBeanDactory(BeanFactory bf) 方法并把 BeanFactory 容器实例作为参数传入。
- 实现 BeanFactoryAware 主要目的是为了获取 Spring 容器,如 Bean 通过 Spring 容器发布事件等
如果 Bean 实现了 ApplicationContextAwaer 接口 ,Spring 容器将调用 setApplicationContext(ApplicationContext ctx) 方法,将 bean 所在的应用上下文的引用传入进来
- 作用与 BeanFactory 类似都是为了获取 Spring 容器,不同的是 Spring 容器在调用 setApplicationContext 方法时会把它自己作为 setApplicationContext 的参数传入,而 Spring 容器在调用 setBeanDactory 前需要程序员自己指定(注入)setBeanDactory 里的参数 BeanFactory
如果 Bean 实现了 BeanPostProcess 接口 ,Spring 将调用它们的 postProcessBeforeInitialization(预初始化)方法
- 作用是在 Bean 实例创建成功后对进行增强处理,如对 Bean 进行修改,增加某个功能
如果 Bean 实现了 InitializingBean 接口 ,Spring 将调用它们的 afterPropertiesSet 方法,作用与在配置文件中对 Bean 使用 init-method 声明初始化的作用一样,都是在 Bean 的全部属性设置成功后执行的初始化方法。
如果 Bean 实现了 BeanPostProcess 接口 ,Spring 将调用它们的 postProcessAfterInitialization(后初始化)方法
- 作用与 6 的一样,只不过 6 是在 Bean 初始化前执行的,而这个是在 Bean 初始化后执行的,时机不同
经过以上的工作后,Bean 将一直驻留在应用上下文中给应用使用,直到应用上下文被销毁
如果 Bean 实现了 DispostbleBean 接口 ,Spring 将调用它的 destory 方法,作用与在配置文件中对 Bean 使用 destory-method 属性的作用一样,都是在 Bean 实例销毁前执行的方法。
4.3 BeanFactory 和 ApplicationContext(Bean 工厂和应用上下文)
Bean 工厂(com.springframework.beans.factory.BeanFactory)是 Spring 框架最核心的接口,它提供了高级 IoC 的配置机制。
应用上下文(com.springframework.context.ApplicationContext)建立在 BeanFactory 基础之上。
几乎所有的应用场合我们都直接使用 ApplicationContext 而非底层的 BeanFactory。
ApplicationContext 的初始化和 BeanFactory 有一个重大的区别:
- BeanFactory 在初始化容器时,并未实例化 Bean,直到第一次访问某个 Bean 时才实例目标 Bean;
- 而 ApplicationContext 则在初始化应用上下文时就实例化所有单实例的 Bean 。
ApplicationContext ctx = new ClassPathXmlApplicationContext("com/baobaotao/context/beans.xml");
ApplicationContext ctx = new FileSystemXmlApplicationContext("com/baobaotao/context/beans.xml");
ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"conf/beans1.xml","conf/beans2.xml"});
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

上一篇: AOP 面向切面编程
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论