package javax.interceptor;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
/**
* 目的:注解一个类为拦截器
*
* <p>注解一个类为拦截器,例如:
* @Interceptor
* public class ValidationInterceptor { ... }
*
* <p>如果{@link javax.interceptor.Interceptors Interceptors}注解
* 或EJB部署描述符在与目标类相关的拦截器使用时,该注解是可选的。若果
* {@linkplain javax.interceptor.InterceptorBinding interceptor binding}
* 被使用时,该注解是必须的。
* @author TCM
* @create 2017年11月8日上午10:52:14
* @see javax.interceptor.Interceptors
* @since Interceptors 1.1
*/
@Retention(RUNTIME)
@Target(TYPE)
@Documented
public @interface Interceptor {
/**
* <p>优先级定义了拦截器被调用的顺序。这些值与{@link javax.annotations.Priority Priority}
* 注解一起使用。
* a. 平台规范定义的拦截器优先值范围是:PLATFORM_BEFORE到LIBRARY_BEFORE,
* 或者从PLATFORM_AFTER开始。
* b. 扩展库定义的拦截器优先值范围是:LIBRARY_BEFORE到APPLICATION,
* 或者LIBRARY_AFTER到PLATFORM_AFTER。
* c. 应用程序定义的拦截器优先值范围是:APPLICATION到LIBRARY_AFTER。
*
* <p>一个拦截器,它必须在另一个定义的拦截器之前或之后调用。其优先级可以选择任何适当的值。
*
* <p>具有较小优先值的拦截器首先被调用。如果不止一个拦截器有相同的优先级,这些拦截器顺序未定义。
*
* <p>例如,扩展库定义拦截器是这样的:
* @Priority(Interceptor.Priority.LIBRARY_BEFORE+10)
* @Interceptor
* public class ValidationInterceptor { ... }
* @since Interceptors 1.2
*/
public static class Priority {
private Priority() { } // 不允许实例化
//平台规范定义的拦截器,优先级的范围开始
public static final int PLATFORM_BEFORE = 0;
//扩展库定义的拦截器,优先级的范围开始
public static final int LIBRARY_BEFORE = 1000;
//应用程序定义的拦截器,优先级的范围开始
public static final int APPLICATION = 2000;
//扩展库定义的拦截器,优先级的范围结束
public static final int LIBRARY_AFTER = 3000;
//应用程序定义的拦截器,优先级的范围结束
public static final int PLATFORM_AFTER = 4000;
}
}
package javax.interceptor;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
import java.lang.annotation.Retention;
/**
* 目的:创建一个拦截器列表
*
* <p>为目标类、目标类的方法或构造函数声明一个有序的拦截器列表。如下:
* @Interceptors(ValidationInterceptor.class)
* public class Order { ... }
*
* @Interceptors({ValidationInterceptor.class,
* SecurityInterceptor.class})
* public void updateOrder(Order order) { ... }
*
* <p>仅业务方法拦截或超时方法拦截,需通过方法级别的拦截器声明来指定。
*
* <p>构造函数拦截需一个构造器级别的拦截器声明来指定。
* @author TCM
* @create 2017年11月9日下午2:36:57
* @see javax.interceptor.ExcludeClassInterceptors
* @see javax.interceptor.ExcludeDefaultInterceptors
* @since Interceptors 1.0
*/
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR})
@Retention(RetentionPolicy.RUNTIME)
public @interface Interceptors {
//拦截器有序列表
Class[] value();
}