您的位置:首页 > 编程语言 > Java开发

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

2009-05-20 14:40 405 查看

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) 发布到现在改变很大:

规范名从 WebBeans -> Java Contexts and Dependency Inject -> Contexts and Dependency Injection for Java -> 目前最新的社区草稿 Contexts and Dependency Injection for Java EE

从对 Spring Bean & Seam Components 的明确支持 -> 使用 SPIs 方式支持

从对 SE 的支持 -> 没有支持(WebBeans RI 倒是支持)

从提供 XML 配置 -> 不提供 XML 配置
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 类型
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: