首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

【转】Java EE 6引入的三大新技术之下上文和依赖性注入(CDI)

2012-12-24 
【转】Java EE 6引入的三大新技术之上下文和依赖性注入(CDI)?? 4.?????????????? h:outputLabel forusern

【转】Java EE 6引入的三大新技术之上下文和依赖性注入(CDI)
?? 4.?????????????? <h:outputLabel for="username">Username:h:outputLabel>
?? 5.?????????????? <h:inputText id="username" value="#{credentials.username}"/>
?? 6.?????????????? <h:outputLabel for="password">Password:h:outputLabel>
?? 7.?????????????? <h:inputText id="password" value="#{credentials.password}"/>
?? 8.??????????? h:panelGrid>
?? 9.??????????? <h:commandButton value="Login" action="#{login.login}" rendered="#{!login.loggedIn}"/>
? 10.??????????? <h:commandButton value="Logout" action="#{login.logout}" rendered="#{login.loggedIn}"/>
? 11.??????? h:form>
? 12.??? f:view>
? 13.?

你可什个很重要的特性,因为EJB组件没有定义良好的范围,尤其是EJB组件不能感知请求,会话和应用程序Web层组件,如 JSF托管Bean的上下文,也不能访问与这些上下文关联的状态。此外,状态EJB组件的生命周期不能作用到Web层上下文。

相比之下,CDI中的作用域对象有一个定义良好的由Java EE容器托管的生命周期上下文,作用域对象可能是按需自动创建的,当上下文创建完毕后又自动销毁的,值得注意的是,作用域状态在相同上下文中执行的客户端之间是自动共享的,这意味着客户端,如其它在相同上下文中执行的Beans,会被当作相同的对象实例看待,但在不同上下文中的客户端看到的是不同的实例。 @SessionScoped注解指定Login Bean的作用域类型是会话作用域。对象通常不会与作用域关联,一般依赖于它们的所有者,这些依赖对象的生命周期是和它们的所有者联系在一起的,一个依赖对象当它的所有者被销毁后它也自动销毁。

Beans通常通过依赖性注入引用其它Beans,依赖性注入机制是一个完全的类型安全,CDI使用JSR 330-Java依赖性注入中指定的注解进行依赖性注入,@Inject就是其中一个注解,它指出Java类或接口上哪个依赖点可以被注入,容器然后提供需要的资源,在这个例子中,Login Bean指定了两个注入点,第一个使用@Inject注解在Credentials Bean上注入一个依赖,容器将会把Credentials Bean注入到这个上下文中创建的所有Login实例上,第二个@Inject注解在JPA EntityManager上注入一个依赖,容器将会注入EntityManager管理持久化上下文。

@Produces注解将getCurrentUser()方法认为是一个生产者方法,每当系统中的另一个Bean需要指定类型的注入对象时就会调用生产者方法,在这个例子中,注入对象是当前登录的用户,它是通过限定注解@LoggedIn注入的,为了使用限定注解,你首先需要将它的类型定义为一个限定器,再使用@Qualifier注解,如:

?? 1. @Target( { TYPE, METHOD, PARAMETER, FIELD })?
?? 2.??? @Retention(RUNTIME)?
?? 3.??? @Documented
?? 4.??? @Qualifier
?? 5.?????? public @interface LoggedIn {...}?
?? 6.?

??? * Java EE 6新特性尝鲜:EJB 3.1重要变化..
??? * Java EE 6,貌似民主下的虚伪公平
??? * Sun的技术爆发 Java EE 6等三重量级产品..
??? * Java EE 6总览:平台的主要目标
??? * Java EE 6引入的三大新技术之JAX-RS

让我们再回到前面讨论的登录提示,当用户响应提示并点击了提交按钮后,CDI技术开始付诸行动,Java EE容器(51CTO编辑推荐:Java EE容器调查:Tomcat大受欢迎 WebLogic成时间杀手)自动实例化Credentials Bean和Login bean的一个上下文实例,一个绑定上下文的Bean的实例叫做上下文实例,JSF指定输入给Credentials Bean上下文实例的用户名和密码,接下来JSF调用Login上下文实例中的login()方法。这个实例对于相同HTTP会话中的其它请求继续存在并可继续使用,并为其它请求它的Bean提供表示当前用户的User对象。

这个例子只说明了这个技术的一部分功能,其它功能如可以让Bean产生或消费事件,定义截取者跨所有Bean类型绑定额外的功能,或者定义装饰者在指定Bean类型上应用额外的功能。

?

热点排行