Java EE CDI bean生命周期介绍

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

介绍

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

作用域使用ApplicationScoped当我们使用一个作用域被定义为应用程序范围内的bean时那就意味着整个bean会存在于应用程序的整个生命周期内。一旦这个bean被初始化之后,每次客户端请求创建该bean,应用程序都会保证请求的是同一个实例。SessionScopedSessionScoped 主要用于web环境下应用的开发。当我们使用一个作用域为session的CDI bean时,表示bean实例的生命周期取决于每个Http Session。RequestScopedRequestScoped主要用于web环境下应用的开发。当我们使用一个作用域为session的CDI bean时,表示bean实例的生命周期取决于每个Http 请求。ConversationScopedConversationScoped主要用于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意味着从始至终仅仅有一个实例存在。DependentDependent 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一直有效到超时,如果真需要像JSFviewscoped bean的bean,你应该参考下面的实现以代替: .Apache deltaspike(前缝面) .ViewAccessScope beans from MyFaces CODI

一切伟大的行动和思想,都有一个微不足道的开始

Java EE CDI bean生命周期介绍

相关文章:

你感兴趣的文章:

标签云: