java6.0新特性<一>

1.简介

本文介绍java6.0(Mustang)版本里面的一些新特性,本文假设读者已经了解java5.0里面的一些概念和术语。如果想了解java5.0的东东,大家可以移步这里。在java6.0中,在语言层次没有标志性的变化,只是在Core、XML、Desktop等方面有所增强,这些特性在J2SE和J2EE平台都可以获得。

2.Java 6 特性

新特性或者增强的点,在java中,以JSR的形式封装起来。JSR就是Java请求规范,就是规范java平台中新增请求的规范。JSR是通过JEG来审核和发布,下面就是java6平台中的一些特性:

  • Pluggable Annotation Processing API (JSR 269)
  • Common Annotations (JSR 250)
  • Java API for XML Based Web Services – 2.0 (JSR 224)
  • JAXB 2.0 (JSR 222)
  • Web Services Metadata (JSR 181)
  • Streaming API for XML (JSR 173)
  • XML Digital Signature (JSR 105)
  • Java Class File Specification Update (JSR 202)
  • Java Compiler API (JSR 199)
  • JDBC 4.0 (JSR 221)
  • Scripting in the Java Platform (JSR 223)

在这里,我们将依次介绍一下公共注、JDBC4.0以及Java平台中的Scripting等内容,剩下的东西,等我找到对应的文章,再陆续翻译出来。

3.公共注

公共注API的目标就是避免应用程序定义自己的注,JSR的目标是提供适用于标准平台和企业级平台的注。与注有关的包javax.annotation和javax.annotation.security。下面,我们简单的介绍一下这些内容。

3.1 @Generated 注

不是所有的源文件或者源代码都需要开发者来写的。随着工具类和框架的发展,大多数公共的代码都会由工具或者框架来生成,这种由工具生成的代码可以通过@Generated注来标记,下面是相关的代码段:

public class MyClass{
 
    public void developerCode(){
    }
 
    @Generated(
        value = "ClassNameThatGeneratedThisCode",
        comments = "This is Tool Generated Code",
        date = "5 June 2007"
    )
    public void toolGeneratedCode(){
    }
 
}

在@Generated中,value一般是类的名字,comments和date是可选项,这些项可以增加代码的清晰度。@Generated注不仅仅用在方法的定义中,它还可以用在包的声明、类的声明、接口的声明、本地变量的声明、字段的声明、参数的声明等。

3.2@Resource和Resources注

任何提供功能性服务的类或者组件都可以使用@Resource注标记成一个资源,这种注可以在J2EE组件(Servlets、EJB、JMS)中,下面,是相应的代码片段:

@Resource(name = "MyQueue", type = javax.jms.Queue,
    shareable = false,
    authenticationType = Resource.AuthenticationType.CONTAINER,
    description = "A Test Queue"
)
private javax.jms.Queue myQueue;

Queue是java消息组件中的一个类,在@Resource注中要标记的属性有:

  • name:这个资源的JNDI名字
  • type:资源的类型,一般是类的全名
  • shareable:告诉大家这个资源是否可分享给其他组件
  • authenticationType:指定验证类型,这个字段可能的值AuthenticationType.CONTAINER和AuthenticationType.APPLICATION
  • description:描述这个资源的用途

当包括@Resource注的应用程序发布服务的时候,在程序启动的时候,容器会扫描资源引用,并在分配新实例的时候填充@Resource引用。

@Resources是@Resource的集合,下面是相关的代码片段:

@Resources({
    @Resource(name = "myQueue" type = javax.jms.Queue),
    @Resource(name = "myTopic" type = javax.jms.Topic),
})

3.3
@PostConstruct and @PreDestroy

J2EE组件一般会在发布的时候,由容器或者框架来创建。容器在创建新组件的时候,会调用默认的或者无参的构造函数,一个普遍的需求就是在组件创建之后,需要初始化一些资源,@PostConstruct注可以达到这个目的。这个注是方法级别的注,也就是说这个注只能用在方法上,它在构造器引用之后,立马调用。

下面是相应的代码片段:

public class MyDbConnectionComponent{
 
    public MyDbConnectionComponent(){
    }
 
    @PostConstruct()
    public void loadDefaults(){
 
        // Load the Driver Class.
        // Get the Connection and Do other stuffs.
 
    }
}

我们可以看出,@PostConstruct注用来初始化资源。loadDefaults方法会在容器创建MyDbConnectionComponent之后,立马被调用。一个方法在定义为@PostConstruct之后,需要遵从一定的规则:

  • 1.方法不能是static类型的
  • 2.返回值要为void
  • 3.不能抛出任何CheckedException等

和@PostConstruct相对应的是@PreDestroy注,从名字中,我们可以看出,被标记为@PreDestroy的方法会在一个实例被容器移除或者销毁之前调用,和上个注一样,它也是方法级别的注,下面是对应的代码片段:

public class MyDbConnectionComponent{
 
    public MyDbConnectionComponent(){
    }
 
    @PreDestroy()
    public void releaseResources(){
 
        // Close the Connection.
        // Unload the Class Driver from the System
 
    }
}

releaseResources方法会在容器销毁实例前调用。

3.4基于角色的注

下面,讨论在对安全有所考虑的应用中,一般都回考虑的基于角色的注。一般来说,一个应用有很多用户,这些用户又具有很多不同的角色。下面通过代码,解释一下@DeclareRoles、@RolesAllowed、@PermitAll、@DenyAll以及@RunAs注等。

3.4.1 @DeclareRoles注

这个一个类级别的注,如果在一个类或者一个组件上面有这个注,那么,也就是这个类或者组件声明了可以访问这个类或者组件的角色集合,下面是相应的代码片段:

@DeclareRoles(value = {"Director", "Manager", "Others" })
public class LeaveService{
 
    @Resource
    private Context context;
 
    public void applyLeave(){
 
        // Any employee can apply for leave. So no need for any
        // conditional check.
    }
 
    public void grantLeave(){
        if(checkUserInRole()){
            // Grant Leave.
        }
    }
 
    public void cancelLeave(){
        if(checkUserInRole()){
            // Cancel Leave.
        }
    }
 
    private boolean checkUserInRole(){
        if( (context.isCallerInRole("Director") )
            || (context.isCallerinRole("Manager")) ){
            return true;
        }
 
        return false;
    }
}

在上面的例子中,组件LeaveService标记为@DeclareRoles注解,它提供了三种服务:applyLeave、grantLeave和cancelLeave。从代码中可以看出,只有具有Director或者Manager角色的用户才有权限批准和否决他们手下的请求。在同意或者否决操作中,要对身份进行验证,只有验证通过的人,才能进行后续的操作。而在申请离职的服务中,由于所有的人均可以申请离职,所以,不存在角色控制问题。

3.4.2 @RolesAllowed注

这是一个类和方法级别的注,用来保证某些服务只能被某些角色访问,下面是相应的代码片段:

@DeclareRoles("A", "B", "C", "X", "Y", "Z")
@RolesAllowed("A", "B", "C")
public class MyServiceComponent{
 
    @RolesAllowed(value = {"A", "X", "Y"} )
    public void myService1(){
    }
 
    @RolesAllowed(value = {"B", "Y", "Z"} )
    public void myService2(){
    }
 
    @RolesAllowed(value = {"X", "Y", "Z"} )
    public void myService3(){
    }
 
    public void myService4(){
    }
}

上面的代码,为组件MyServiceComponent声明了角色“A”, “B”, “C”, “X”, “Y” and “Z”,@RolesAllowed注用来声明可以访问这个方法的角色。比如,只有角色AXY的用户才允许访问myService1().对于myservice2,只有BYZ角色的用户才能访问。

那么,对于没有注的myService4()方法,是什么样子的?

如果一个方法没有@RolesAllowed注,那么,这个方法继承了类的@RolesAllowed,也就是ABC角色的用户,可以访问这个方法。如果一个类没有@RolesAllowed注呢?这个方法该怎么办?好办,@DeclareRoles声明的角色均可以访问这个方法。

3.4.3 @PermitAll和DenyAll注

这些是类和方法层次的注,如果注在类上,将影响整个类中的方法;如果注仅仅在方法上,仅影响这个方法。下面是相应的代码片段:

@DeclareRoles(value = {"A", "B", "C"} )
class MyClass{
 
    @PermitAll()
    public void commonService(){
    }
 
    @DenyAll
    public void confidentialService(){
    }
}

对于上面的代码,commonService方法由于被标注为@PermitAll,类中声明的所有角色均可以访问;而方法confidentialService由于被标注为@DenyAll,类中声明的所有角色均不可访问。

备注:

1.本节的内容,主要是关于注的内容,下面会有关于java平台中的脚本语言相关的内容。

2.原文地址:http://www.javabeat.net/2007/06/introduction-to-java-6-0-new-features-part-i/

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>