Java中自定义的注解的编写以及在AOP中的应用
前一编博文讲述了注解实现和应用,其中有一个涉及到自定注解的地方,本文就这个问题继续写与这相关的
一,编写自定义注解需要的基础知识,
编写自定义注解需要使用的Java元注解,有四种元注解:@Retention、@Inherited、@Documented、@Target
@Retention
注解的保留位置(枚举RetentionPolicy),RetentionPolicy可选值:
SOURCE:注解仅存在于源码中,在class字节码文件中不包含
CLASS:默认的保留策略,注解在class字节码文件中存在,但运行时无法获得
RUNTIME:注解在class字节码文件中存在,在运行时可以通过反射获取到
@Inherited
声明子类可以继承此注解,如果一个类使用此注解,则该类的子类也继承此注解;
@Documented
声明注解能够被javadoc等识别;
@Target
用来声明注解范围(枚举ElementType),ElementType可选值:
TYPE:接口、类、枚举、注解
FIELD:字段、枚举的常量
METHOD:方法
PARAMETER:方法参数
CONSTRUCTOR:构造函数
LOCAL_VARIABLE:局部变量
ANNOTATION_TYPE:注解
PACKAGE:包
二,自定义一个注解,并在AOP中应用
目标是自定义一个注解类,然后应用到需要的地方,再在切面类中使用,利用AOP实现某些业务功能,分三步如下;
1,定义一个自定义注解类,注意被spring扫描到
@Retention(RetentionPolicy.RUNTIME)
@Target(value={ElementType.METHOD,ElementType.FIELD})
@Documented
@Inherted
public @interface AspectXxx{
//String value() default ""; //例子
//...如果有需要增加更多...
}
2,定义切面类,实现某些需要的功能;
@Component //做为spring组件
@Aspect //指定为切面类
public class AspectXXXImpl {
@Ponitcut(value="execution(public * com.x.y.z.impl..*(..))")
public pointcut01(){}
//切面作用的目标表达式
@Ponitcut(value="@annotation(com.x.y.z.AspectXxx)")
//@Ponitcut得到注解应用的地方,@annotation作用的结果是得到方法作用的目标表达式
public pointcut02(){}
//切面作用的目标表达式,也即注解应用的地方
@Before(value="pointcut02()")
public void beforeExecute(JoinPoint joinPoint){
//...方法执行前的处理...
}
@AfterReturning(value="pointcut02()", returning="result")
public void afterExecute(JoinPoint joinPoint, Object result){
//...方法返回值时的处理...
}
@Around(value="pointcut02()")
public void aroundExecute(ProceedingJoinPoint joinPoint) throws Throwable{
//...方法执行前后的处理,注意这里参数ProceedingJoinPoint...
}
@AfterThrowing(pointcut = "pointCut()", throwing="e")
public void afterThrowing(JoinPoint joinPoint, Throwable e){
//...方法执行报异常时的处理...
}
@After(value="pointcut02()")
public void afterExecute(JoinPoint joinPoint) throws Throwable{
//...方法执行后的处理...
}
}
3,注解应用到需要的地方
在service实现类或controller类等等的方法前使用自定义注解,如;
//...
@AspectXxx(value="test")
public void yyyFun(...){
//...方法体...
}
//...