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(...){
//...方法体...
}

//...


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值