Java EE 6简化开发总结:注解支持与Profile

原创
开发 后端
Java EE的最新版本,Java EE 6同时强调了简单性和易用性,进一步简化了平台,扩展了可用性。在简化开发这方面,Java EE 6让更多类型的Java EE组件可以用注解来控制,并引入了Profile的概念。本文对这方面进行了介绍,并对Java EE 6平台进行了总结。

【51CTO精选译文】在51CTO之前的一系列Java EE 6的文章中,已经介绍了诸如CDIBean验证等新技术,以及Web分片Facelets,无接口视图,以及标准API等支持,通过这些特性可以更容易地开发企业或Web应用程序。此外,Java EE 6平台许多地方的安全性也得到了极大的增强,特别是注解现在可以用在更多类型的Java EE组件中了,用于依赖性注入的注解现在也标准化了,使可注入类具有更好的跨框架迁移特性。

注解支持更多类型的Java EE组件

Java EE 5引入了最简单的基于注解的编程模型,在新版本中得到了扩展,可以支持更多类型的Java EE组件,如Servlet和JSF组件。例如,在Web应用程序中再也不用部署描述符定义Servlet了,你需要做的就是使用@WebServlet注解标记一个类,如:

  1. @WebServlet(name="CalculatorServlet", urlPatterns={"/calc""/getVal"})  
  2.    public class CalculatorServlet extends HttpServlet{  
  3.       public void doGet(HttpServletRequest req, HttpServletResponse res) {  
  4.       ...  
  5.       }  
  6.  
  7.       ...  
  8.    }  
  9.  

@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注解设置其范围即可,如:

  1. import javax.faces.bean.ManagedBean;  
  2.    import javax.faces.bean.RequestScoped;  
  3.  
  4.    @ManagedBean(name="userBean")  
  5.    @RequestScoped 
  6.    public class UserBean {  
  7.  
  8.       private String name;  
  9.  
  10.       public String getName() {  
  11.    return name;  
  12.       }  
  13.       public void setName(String name) {  
  14.    this.name = name;  
  15.       }  
  16.       public UserBean() {}  
  17.    }  
  18.  

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类上注入一个依赖;

  1. class Stopwatch {  
  2.       final TimeSource timeSource;  
  3.       @Inject Stopwatch(TimeSource TimeSource) {  
  4.         this.TimeSource = TimeSource;  
  5.       }  
  6.       void start() { ... }  
  7.       long stop() { ... }  
  8.    }  
  9.  

依赖注入可以通过其它注入进行扩展,例如,假设你想创建一个StopwatchWidget类,它在Stopwatch类上有一个依赖,那么你可以象下面这样定义这个类:

  1. class StopwatchWidget {  
  2.       @Inject StopwatchWidget(Stopwatch sw) { ... }  
  3.       ...  
  4.    }  
  5.  

#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

责任编辑:yangsai 来源: 51CTO.com
相关推荐

2023-08-11 18:16:08

DevOps开发

2010-01-18 09:37:39

JSF 2.0Java EE 6

2011-08-12 08:40:39

PaaSOpenShiftJava EE 6

2009-10-28 12:39:33

Java EE无框架

2010-05-27 12:30:52

MySQL工具

2020-11-10 08:54:55

Lombok

2009-10-26 10:05:51

NetBeans 6.

2010-06-02 10:00:25

MySQL工具

2009-06-11 17:54:00

Visual StudDataSet

2009-12-11 11:33:09

NetBeans 6.

2010-05-24 09:47:32

AjaxAjax框架

2011-12-31 15:24:48

JavaJ2EE

2009-12-09 14:31:59

IntelliJ

2010-07-06 10:34:33

RationalJazz需求管理

2010-01-26 09:23:18

Java EE 6

2009-10-20 09:25:17

Java EE 6最终

2009-12-15 10:11:10

2010-02-03 09:06:26

Java EE 6

2010-03-22 09:33:18

Bean Valida

2011-06-28 13:43:50

Java EE
点赞
收藏

51CTO技术栈公众号