【51CTO精选译文】在51CTO之前的一系列Java EE 6的文章中,已经介绍了诸如CDI和Bean验证等新技术,以及Web分片,Facelets,无接口视图,以及标准API等支持,通过这些特性可以更容易地开发企业或Web应用程序。此外,Java EE 6平台许多地方的安全性也得到了极大的增强,特别是注解现在可以用在更多类型的Java EE组件中了,用于依赖性注入的注解现在也标准化了,使可注入类具有更好的跨框架迁移特性。
注解支持更多类型的Java EE组件
Java EE 5引入了最简单的基于注解的编程模型,在新版本中得到了扩展,可以支持更多类型的Java EE组件,如Servlet和JSF组件。例如,在Web应用程序中再也不用部署描述符定义Servlet了,你需要做的就是使用@WebServlet注解标记一个类,如:
- @WebServlet(name="CalculatorServlet", urlPatterns={"/calc", "/getVal"})
- public class CalculatorServlet extends HttpServlet{
- public void doGet(HttpServletRequest req, HttpServletResponse res) {
- ...
- }
- ...
- }
@WebServlet注解是Servlet 3.0提供的注解之一,下面是Servlet 3.0中提供的其它注解:
@WebFilter:在Web应用程序中定义Servlet过滤器;
@WebInitParam:指定所有必须传给Servlet或Servlet过滤器的init参数;
@WebListener:注解一个监听器,在特定Web应用程序上下文中获得各种不同操作事件;
@MultipartConfig:在一个Servlet上指定时,表示Servlet的MIME类型是multipart/*。
JSF 2.0中注解支持的一个好处是简化了配置托管Bean的方法,不再需要在JSF配置文件faces-config.xml中通过配置注册一个托管Bean,现在你只需要使用@ManagedBean注解标记托管Bean,并使用RequestScope注解设置其范围即可,如:
- import javax.faces.bean.ManagedBean;
- import javax.faces.bean.RequestScoped;
- @ManagedBean(name="userBean")
- @RequestScoped
- public class UserBean {
- private String name;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public UserBean() {}
- }
JSF 2.0还提供了其它一些注解,如:
@ManagedProperty:将Bean的属性标记为托管属性;
@ResourceDependency:声明组件将要使用的资源;
@ListenFor:允许组件将特定事件作为一个监听器订阅到组件;
@FacesConverter:将类注册为一个Converter,也就是说,这个类可以执行Object到String,和String到Object的转换;
@FacesValidator:将类注册为一个Validator,也就是说,这个类可以执行验证。
#t#如果你想让一个注解得到处理,无论是Servlet 3.0注解还是JSF 2.0注解,你需要将使用这些注解标记的类放到Web应用程序的WEB-INF/classes目录下,也可以将这些类打包到一个jar文件,然后放到程序的WEB-INF/lib目录下。
在Web分片的例子中,我们在web.xml文件中使用<metadata-complete>元素通知Web容器是否要寻找注解,如果你将<metadata-complete>设为false,或者在文件中不指定<metadata-complete>元素,那么在部署期间,容器必须扫描注解和Web分片,为Web应用程序构建有效的元数据。如果将<metadata-complete>设为true,将由部署描述符为Web应用程序提供所有的配置信息。在这个例子中,Web容器不会搜索注解和Web分片。
随着对注解和新方法ServletContext的支持,web.xml对Servlet 3.0来说显得可有可无,也就是说,在应用程序war文件中不再需要包括一个web.xml文件。
#p#
标准化的依赖注入注解
依赖注入是开发企业Java应用程序的一种流行技术,在依赖注入中,也叫做反转控制,一个组件指定它依赖的资源,一个注入器通常是一个容器,它为组件提供资源,虽然依赖注入有多种实现方式,但许多开发人员习惯使用注解来实现它。依赖注入在Java开发框架中得到了广泛使用,如Spring和Guice。遗憾的是,之前还没有基于注解构建依赖注入的标准方法,特别需要注意的是,Sping框架采用的基于注解的依赖注入方法与Guice采用的方法不一样。
随着Java EE 6的发布,这个问题得到了解决,随Java EE 6发布的JSR 330:Java依赖注入改变了这种境况,这个规范的目标是为依赖注入提供一个标准的,可扩展的API。
API由一套用在可注入类上的注解组成,这些注解包括:
@Inject:标识可注入的构造器,方法和字段;
@Qualifier:标识合法的注解,合法的是强类型键,它可以帮助区分相同类型的对象不同使用方法。例如,@Red Car和@Blue Car可以理解为相同类型的不同实例,在这个例子中,@Red和@Blue是合法的;
@Scope:标识注解范围;
@Singleton:标识注入器只实例化一次的类型。
例如,下面的类Stopwatch使用@Inject注解在TimeSource类上注入一个依赖;
- class Stopwatch {
- final TimeSource timeSource;
- @Inject Stopwatch(TimeSource TimeSource) {
- this.TimeSource = TimeSource;
- }
- void start() { ... }
- long stop() { ... }
- }
依赖注入可以通过其它注入进行扩展,例如,假设你想创建一个StopwatchWidget类,它在Stopwatch类上有一个依赖,那么你可以象下面这样定义这个类:
- class StopwatchWidget {
- @Inject StopwatchWidget(Stopwatch sw) { ... }
- ...
- }
#t#在响应中,注入器发现一个TimeSource对象,使用TimeSource对象构造一个Stopwatch对象,然后再使用Stopwatch对象构造一个StopwatchWidget对象。
JSR 330制定的标准化注解使可注入类可以跨框架迁移,你不用再为特定厂商的注解忙碌了。
注意在JSR 330上构建的CDI和向依赖注入增加的新功能,包括自动发现,可注入类的配置,在运行时定义新的可注入类的API,帮助与第三方框架集成。(51CTO编辑注:针对Java EE 6当中的JSR 330依赖注入,JCP成员们当中是存在一些争议的,具体可参考这篇JSR 330通过时各方争议的总结文章)
#p#
Profile(配置文件)和裁剪
Java EE 6引入了Profile的概念,它减小了Java EE平台的大小,Profiles是Java EE平台的配置,一个Profile可能包括Java EE平台技术的一个子集,其它技术则通过JCP取得,但JCP并不是Java EE平台的一部分。例如,假设有一个电话系统的Profile,这个Profile可能包括了Java EE Web层技术,如Servlet和JSP,EJB企业组件模块和持久化JPA,它也可能包含面向电话的技术,如JSR 289:SIP Servlet 1.1,虽然这个规范已经经历了JCP过程,但还不是Java EE平台的一部分。
Profile是由JCP社区进程定义的。此外,Java EE 6规范为在Java EE Profiles中引用Java EE平台技术定义了规则,Java EE 6也强调了一个原则,那就是创建一个Profile得有充分的理由,规范是这样描述的“创建一个Profile的决定应该考虑它潜在的缺点,特别是分片和开发人员混淆方面,通常,只有当开发人员都支持,并且都理解了应用程序可以因此而得到哪些好处时,才需要创建一个Profile”。
Profile有意独立于Java EE 6平台发展,Profile是通过Java规范请求(Java Specification Request,JSR)提交的,但是按它自己的节奏发布的,它与Java EE平台的版本并没有保持完整的一致性,也就是说诸如前面虚构的电话系统Profile可以按其行业发展情况自由发展,不与Java EE平台或其它Profile绑定,但需要注意,最好定期让Profile与平台同步,特别是平台的一个主要版本发布时应该同步。目标是维持一个公共的编程模型,简化开发人员跨整个Java EE 6产品家族的学习过程。(51CTO编辑注:在Java EE 6最终通过的投票上,JCP成员仍存有争议,其中之一就是针对Profile这个概念。比如说,SpringSource的Rod Johnson认为Profile的引入过于仓促,带入了很多未经证实的技术。)
Web Profile
Java EE 6定义的第一个Profile叫做Web Profile,它提供了一个Java EE平台的子集,其设计目的主要是用于Web开发,Web Profile只包括大部分开发人员需要的那些技术。
下表列出了完整的Java EE 6平台技术,Web Profile使用的技术全部打上勾了。
Java EE平台技术
|
Web Profile
|
Web应用程序技术
|
|
JSR 315: Java Servlet 3.0
|
✓
|
JSR 314: JavaServer Faces (JSF) 2.0
|
✓
|
JSR 245: JavaServer Pages 2.2 and Expression Language (EL) 1.2
|
✓
|
JSR 52: A Standard Tag Library for JavaServer Pages 1.2
|
✓
|
JSR-45: Debugging Support for Other Languages 1.0
|
✓
|
企业应用程序技术
|
|
JSR 299: Contexts and Dependency Injection for the Java EE Platform 1.0
|
✓
|
JSR 330: Dependency Injection for Java
|
✓
|
JSR 318: Enterprise JavaBeans 3.1
|
✓
|
JSR 317: Java Persistence API 2.0
|
✓(EJB Lite)
|
JSR 250: Common Annotations for the Java Platform 1.1
|
✓
|
JSR 907: Java Transaction API (JTA) 1.1
|
✓
|
JSR 303: Bean Validation 1.0
|
✓
|
JSR 322: Java EE Connector Architecture 1.6
|
|
JSR 914: Java Message Service (JMS) API 1.1
|
|
JSR 919: JavaMail 1.4
|
|
Web Service技术
|
|
JSR 311: JAX-RS: The Java API for RESTful Web Services 1.1
|
|
JSR 109: Implementing Enterprise Web Services 1.3
|
|
JSR 224: Java API for XML-Based Web Services (JAX-WS) 2.2
|
|
JSR 222: Java Architecture for XML Binding (JAXB) 2.2
|
|
JSR 181: Web Services Metadata for the Java Platform
|
|
JSR 101: Java APIs for XML based RPC 1.1
|
|
JSR 67: Java APIs for XML Messaging 1.3
|
|
JSR 93: Java API for XML Registries 1.0 (JAXR) 1.0
|
|
管理和安全技术
|
|
JSR 196: Java Authentication Service Provider Interface for Containers 1.0
|
|
JSR 115: Java Authorization Contract for Containers 1.3
|
|
JSR 88: Java EE Application Deployment 1.2
|
|
JSR 77: J2EE Management 1.1
|
注意,Web Profile包括一个Servlet容器和所有传统的展示技术,如JSP,JSF和JSP的标准Tag库,EJB 3.1轻量级版是一个组件模型,也包括持久化JPA和事务管理JTA,还有Web分片,你可以使用传统的框架或库(如JAX-RS)轻松地扩展Web Profile。
裁减(Pruning)
Java EE 6平台中引入的另一个可以减小平台大小的技术是裁减,裁减一种技术意味着这种技术在下一个平台版本中,它可能成为一个可选组件,而不是一个必备组件,最终由社区进行决策。裁减可以减小Java EE平台产品的大小,因为Java EE应用程序厂商可能会在其实现中包括被裁减的技术,也可能排除被裁减的技术,如果包括被裁减计划的话,必须要提供兼容能力,保证现有应用程序可以继续运行。
#t#下面这些技术都是即将被裁减的候选者:
◆JSR 101:基于XML的RPC Java API
◆JSR 93: XML注册1.0 Java API (JAXR)
◆EJB实体Bean(定义为JSR 153:EJB 2.0或更早版本的一部分)
◆JSR 88: Java EE应用程序部署
小结
随着对Profile的支持,大量新技术如JAX-RS,增强的扩展性功能,如Web分片和平台级的注解,Java EE 6让Java EE平台更加灵活,更加强大,对于开发人员而言更加友好。连Hibernate之父Gavin King也推荐开发者们升级到Java EE 6,你为什么不下载Java EE 6 SDK,尝试一个Java EE 6平台下的实现呢?
原文:Further Ease of Development 作者:Ed Ort