Java 上下文与依赖注入(JSR 299)[1]

Java 上下文与依赖注入(JSR 299)[1]

转载请保留作者信息:
作者:88250
Blog: http:/blog.csdn.net/DL88250
MSN & Gmail & QQ:DL88250@gmail.com

摘要

本文从 JSR 299 规范入手,整理并翻译了该规范中非常重要的概念,并结合一些短小的例子对 JSR 299 的使用进行了说明。文中略过了如何使用 XML 配置 bean,主要介绍使用标注(annotation)配置。

1. 绑定

1.1 定义新的绑定类型

@BindingType
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface Synchronous {}

@BindingType
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface Asynchronous {}

这里定义了两个 绑定类型,@Synchronous 与 @Asynchronous,以后就可以使用它们定义 bean 了,这个定义步骤就是 绑定

对于类型安全解析算法而言, 绑定类型的成员值是非常重要的:
@BindingType
@Retention(RUNTIME)
@Target({METHOD, FIELD})
public @interface PayBy {
PaymentMethod value();
}

1.2 绑定

这里使用上述的 绑定类型进行两个 beans 的 绑定
@Synchronous
public class SynchronousPaymentProcessor
implements PaymentProcessor {
...
}

@Asynchronous
public class AsynchronousPaymentProcessor
implements PaymentProcessor {
...
}

这两个 bean 都实现了 PaymentProcessor 这个 bean 类型,在 注入点就可以根据需要进行注入了:
@Synchronous PaymentProcessor paymentProcessor;
@Asynchronous PaymentProcessor paymentProcessor;

一个 bean 可以定义多个 绑定类型
@Synchronous @Reliable
public class SynchronousReliablePaymentProcessor
implements PaymentProcessor {
...
}

1.3 缺省绑定

缺省绑定可以使用 @Current:
@Current
public class Order {}
等价于
public class Order {}

在注入时,
public class Order {
public Order(@Current OrderProcessor processor) { ... }
}
等价于
public class Order {
public Order(OrderProcessor processor) { ... }
}

2. 作用域

2.1 内建的作用域

2.1.1 @SessionScoped
该作用域被激活于任意的 servlet.service() 方法,并跨越任意 filter.doFilter() 方法。Session 上下文将被所有同一 HTTP servlet session 内的 servlet requests 所共享,在 httpSession.invalidate() 方法调用时销毁。
2.1.2 @RequestScoped
  • 该作用域被激活于任意的 servlet.service() 方法,并跨越任意 filter.doFilter() 方法。Request 上下文将在 servlet request 结束时被销毁,即在 sevlet.service() 方法与所有 filter.doFilter() 方法返回后
  • 该作用域被激活于 Java EE web service 调用,并在该 web service 调用完成时销毁
  • 该作用域被激活于任意的异步的观察者方法通知时,并在该通知结束完成时销毁
  • 该作用域被激活于任意的 EJB 远程方法调用,并跨越任意 EJB 超时方法以及对于任意 EJB 消息驱动 bean 的消息递送。该上下文在远程方法调用完成、超时或消息递送完成时被销毁
2.1.3 @ApplicationScoped
  • 该作用域被激活于任意的 servlet.service() 方法,并跨越任意 filter.doFilter() 方法
  • 该作用域被激活于 Java EE web service 调用
  • 该作用域被激活于任意的异步的观察者方法通知时
  • 该作用域被激活于任意的 EJB 远程方法调用,并跨越任意 EJB 超时方法以及对于任意 EJB 消息驱动 bean 的消息递送

Application 上下文在同一应用中的所有 servlets、 异步的观察者方法通知、web service 调用、EJB 远程方法调用、EJB 超时方法以及 EJB 消息驱动 bean 的消息递送执行所共享,在应用反部署时被销毁。该作用域可以看作是应用内的静态作用域。

2.1.4 @ConversationScoped
后续文章分析 :-)

2.1.5 @Dependent
后续文章分析 :-)

作用域类型是可扩展的:
@ScopeType
@Inherited
@Target({TYPE, METHOD, FIELD})
@Retention(RUNTIME)
public @interface BusinessProcessScoped {}

3. 部署类型

3.1 内建的部署类型

内建的 部署类型:@Standard, @Production

部署类型是可扩展的:
@DeploymentType
@Target({TYPE, METHOD, FIELD})
@Retention(RUNTIME)
public @interface Australian {}
****
@Production
public class TaxPolicies {
@Produces @Australian
public TaxPolicy getAustralianTaxPolicy() { ... }
}

缺省情况下,如果没有显示指定部署类型标注,bean 中的产生器方法或者字段将继承这个 bean 的部署类型。如果 bean 显示声明了部署类型,那么由构型声明的部署类型将被忽略。

4. 构型

在体系结构设计中,构型是非常重要的一个概念。一个构型定义了一种 bean 角色,允许开发人员对这种 bean 统一地标识出公共的元数据。在 JSR 299 中,构型可以封装下列概念的任意组合:
  • 一个缺省部署类型
  • 一个缺省作用域
  • 对 bean 作用域的一个限制(restriction)
  • 对一个 bean 实现或者是对一个类型的扩展的需求
  • 一个拦截器绑定的集合

4.1 定义新的构型

@Stereotype
@RequestScoped
@Production
@Target(TYPE)
@Retention(RUNTIME)
public @interface Action {}

标注了 @Action 的 bean 都将默认拥有 @RequestScoped 的作用域与 @Production 的部署类型,除非在 bean 上显示标注了其他作用域与部署类型:

@Mock @ApplicationScoped @Action
public class MockLoginAction extends LoginAction { ... }

4.2 内建的构型

内建的构型有如下三种:
@Model
@Interceptor
@Decorator


后记


JSR 299 规范还处于草稿阶段,从 EDR(Early Draft Review) 发布到现在改变很大:
  1. 规范名从 WebBeans -> Java Contexts and Dependency Inject -> Contexts and Dependency Injection for Java -> 目前最新的社区草稿 Contexts and Dependency Injection for Java EE
  2. 从对 Spring Bean & Seam Components 的明确支持 -> 使用 SPIs 方式支持
  3. 从对 SE 的支持 -> 没有支持(WebBeans RI 倒是支持)
  4. 从提供 XML 配置 -> 不提供 XML 配置
  5. http://in.relation.to/Bloggers/NewDraftOfJSR299ForReviewByTheCommunity

不过,其核心思想:服务端组件状态模型一点没变,对 JSF EJB 的整合没变。当然,目前改规范还不是很稳定,最终草稿可能在下个月发布,拭目以待。

术语中英对照

annotation: 标注
binding (type): 绑定(类型)
scope: 作用域
asynchronous: 异步的
observer: 观察者
context: 上下文
deployment (type): 部署(类型)
stereotype: 构型
producer (method): 产生器(方法)
field: 字段
injection point: 注入点
bean type: bean 类型

<script>&lt;!-- viewOnLoad(); var urchinPage = "/View"; function getXHR() { if (typeof XMLHttpRequest != "undefined") { return new XMLHttpRequest(); } try { return new ActiveXObject("Msxml2.XMLHTTP.6.0") } catch(e) {} try { return new ActiveXObject("Msxml2.XMLHTTP.3.0") } catch(e) {} try { return new ActiveXObject("Msxml2.XMLHTTP") } catch(e) {} try { return new ActiveXObject("Microsoft.XMLHTTP") } catch(e) {} return null; } function reportAbuse() { var req = getXHR(); if (req) { var docid = 'ddrm6c35_1134dpq85h7n'; var posttoken = ''; req.onreadystatechange = function() { try { if (req.readyState == 4 &amp;&amp; req.status == 200) { var button = document.getElementById("report-abuse-button"); button.value = 'Thank you!'; button.disabled = true; } } catch (ex) { } } try { req.open('POST', 'MiscCommands', true); req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); req.send('command=report_abuse&amp;abuseDoc=' + encodeURIComponent(docid) + '&amp;POST_TOKEN=' + encodeURIComponent(posttoken)); } catch (ex) { } } } --&gt;</script>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值