Java EE CDI bean生命周期介绍

这篇博客主要介绍CDI提供的不同bean的生命周期及在项目中如何使用它们。

介绍

当一个bean被CDI初始化时,这个bean通常会有自己的作用域。而赋予它的作用域通常就会决定了这个bean的整个生命周期。CDI提供的bean的生命周期:

作用域 使用
ApplicationScoped 当我们使用一个作用域被定义为应用程序范围内的bean时那就意味着

整个bean会存在于应用程序的整个生命周期内。一旦这个bean被初始

化之后,每次客户端请求创建该bean,应用程序都会保证请求的是同

一个实例。

SessionScoped SessionScoped 主要用于web环境下应用的开发。当我们使用一个作

用域为session的CDI bean时,表示bean实例的生命周期取决于每个

Http Session。

RequestScoped RequestScoped
主要用于web环境下应用的开发。当我们使用一个

作用域为session的CDI bean时,表示bean实例的生命周期取决于每

个Http 请求。

ConversationScoped ConversationScoped主要用于web环境下应用的开发。如同其名一样,ConversationScoped标志客户端同服务端的一次交流 。他们可能被

用于保持多个ajax请求或者不同页面请求与服务端交互的状态信息。

注意:在Java EE7中介绍了一系列的CDI beans的作用域,如TransactionScoped,FlowScoped and ViewScoped.等等,更多信息参考Java
EE 7 CDI bean scopes

CDI同时也提供了另外两种pseudo-scopes:

作用域 使用
Singleton 如同其名一样,Singleton bean标志着单实例,如果一个bean被用作Singleton意味着从始至终仅仅有一个实例存在。
Dependent Dependent scope bean的作用域与其被注入的bean的作用域一样。如当一个定义为Dependent的

bean被注入到一个会话bean中,那么这个bean的作用域和生命周期同这个会话bean一样,当会话

结束此bean的生命周期也就截止了。

代理

当一个被CDI容器管理的bean被注入到其他bean中时,CDI容器并不是注入的bean实例,而是注入的一个代理类。通常这个代理类会将客户端的相应请求再转发给相应的bean去处理。

想想SessionScoped bean,如果不同的会话请求一个SessionScoped 会话实例,这些请求都会被交给同一个代理处理。当这些请求访问这些被代理的对象时,代理对象知道如何找到相应的对象实例并为相应的会话提供这却的服务。

注意:单例的 pseduo-scope与这种代理模式正好相对应。当一个客户端请求一个单例的bean时,CDI容器会将这个bean的实例注入到相应的bean中而不再是一个代理。

序列话

一些被CDI容器管理的bean可以保持很长时间的生命周期,如SessionScoped、ConversationScoped,但是他们必须实现序列化接口。这是由于容器要释放一些资源,而这些资源往往需要连同bean的类信息持久化到物理磁盘上,等到程序再次需要的时候能够保证容器再次将这些bean的状态从物理磁盘中恢复出来。

Singleton pseudo-scoped

我们知道当我们使用Singlescoped 时,客户端会得到该对象实例的真正引用。因此当客户端请求的是序列化的,就必须保证这个实例是单例的。我们而保证这个单例的bean是一个正真的单例的方法如下:

1.正如java序列话标准声明的那样,这个单例要实现writeReplace()和readResolve()方法。

2.维护单例的引用对象的瞬时状态,当容器反序序列化该对像时,容器要保证重新注入该对象的引用。

Dependent pseudo-scope

如果没有特别声明的话,Dependent是CDI默认的作用域。Dependent意味着注入的bean与被注入的bean有相同的作用域。客户端不会共享实例,每个客户端拿到的将会是一个新的对象实例。

view scope

update:在java EE7中增加了viewscoped,详细信息请参考Java
EE 7 CDI bean scopes
Java
EE CDI ViewScoped example
.

如果你熟悉JSF bean的作用域,您可能想知道哪个viewscoped
bean符合这个模型。CDI不提供任何viewscoped但提供conversationscoped代替。

conversationscoped与我们实现相同的功能,通常需要从一个viewscoped的JSF bean(bean之间保持状态的Ajax请求),更有可能保持不同的页面请求的相同的对话或状态。

注:请记住,如果用户离开当前对话而没有结束这样的对话机会,托管bean将保持有效,直到它超时。所以如果你有一个真正的问题这些bean一直有效到超时,如果真需要像JSF viewscoped
bean的bean,你应该参考下面的实现以代替:

.Apache deltaspike(前缝面)

.ViewAccessScope beans from MyFaces CODI

时间: 2024-08-10 18:10:30

Java EE CDI bean生命周期介绍的相关文章

Java EE 的核心技术规范(介绍)

JAVA EE简介 Java 平台企业版(Java Platform Enterprise Edition),java EE平台旨在帮助开发人员创建大规模,多层,可伸缩,可靠和安全的网络应用程序.此类应用程序的简称是“企业应用程序”,之所以这么称呼是因为这些应用程序旨在解决大型企业遇到的问题.但是,企业应用程序不仅对大型公司,代理机构和政府有用.对于日益联网的世界中的个人开发人员和小型组织,企业应用程序的好处是有益的,甚至是必不可少的. Java EE服务器 Java EE服务器是实现Java

hibernate--持久对象的生命周期介绍

持久化对象的状态 : 1. 瞬时对象(Transient Object):使用new操作符初始化的对象不是立刻就持久的.它们的状态是瞬时的,也就是说它们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象(不再被任何其它对象所引用),它们的状态将会丢失,并由垃圾回收机制回收 2. 持久化对象(Persistent Object):持久实例是任何具有数据库标识的实例,它有持久化管理器Session统一管理,持久实例是在事务中进行操作的----它们的状态在事务结束时同数据库进行同步.当事务提交时

Android四大基本组件介绍与生命周期介绍。

Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器. 一:了解四大基本组件 Activity : 应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应. Activity之间通过Intent进行通信.在Intent 的描述结构中,有两个最重要的部分:动作和动作对应的数据. 典型的动作类型有:M AIN(activity的门户).V

一步步剖析spring bean生命周期

关于spring bean的生命周期,是深入学习spring的基础,也是难点,本篇文章将采用代码+图文结论的方式来阐述spring bean的生命周期, 本篇文章将阐述清楚下图. 一  项目结构及源码 1.程序目录结构 2.applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/sc

Bean 生命周期

对于普通的Java对象,当new的时候创建对象,当它没有任何引用的时候被垃圾回收机制回收.而由Spring IoC容器托管的对象,它们的生命周期完全由容器控制. Bean生命周期流程 1.实例化Bean 实例化Bean对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用createBean进行实例化. 对于ApplicationContext容器,当容器启动结束后,便实例化所有的bean. 容器通过获取B

Spring点滴四:Spring Bean生命周期

Spring Bean 生命周期示意图: 了解Spring的生命周期非常重要,我们可以利用Spring机制来定制Bean的实例化过程. --------------------------------------------------------------------------------------------------------------------------------------------------- spring-service.xml: <?xml version=

bean生命周期

那在spring中bean的生命周期究竟是怎样的呢 1. 容器寻找Bean的定义信息并将其实例化 2. 使用依赖注入,spring按照Bean定义信息配置Bean的所有属性 3. 如果Bean实现了BeanNameAware接口,工厂调用Bean的SetBeanName()方法传递Bean的ID 4. 如果Bean实现了BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身 5. 如果BeanPostProcessor和Bean关联,那么其postProc

Java 并发 线程的生命周期

Java 并发 线程的生命周期 @author ixenos 线程的生命周期 线程状态: a)     New 新建 b)     Runnable 可运行 c)     Running 运行 (调用getState()时显示为Runnable) d)     Blocked 阻塞 i.          I/O阻塞 (不释放锁) I/O操作完成解除阻塞,进入Runnable状态 ii.          同步阻塞(不释放锁) 运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会

【Spring学习】Bean生命周期

我理解的Bean生命周期包括两个方面: Bean何时创建,何时销毁 Bean从创建到销毁的执行流程 一.Bean创建与销毁 Bean的创建时机主要由几个配置项共同来决定,包括: scope属性,决定是Bean是单例模式(singleton)还是多例模式(prototype),默认为单例singleton: lazy-init属性,只对单例模式有效,决定是否延时加载,默认为false,表示在容器初始化时,就会生成单例: RequestMapping属性,这个注解MVC中才有,当有该属性时,lazy