一、获取自定义注解的参数
1.1、创建带属性的自定义注解,用来注解切点(pointcut)
要获取自定义注解参数,就需要在自定义注解中增加几个属性,下面自定义的TimedTaskLog 中有两个属性:name和time。
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD) //定义注解的使用范围为方法
@Retention(RetentionPolicy.RUNTIME )
public @interface TimedTaskLog {
String name() default "未添加...";
String time() ;
}
1.2、在需要的方法上使用带属性的自定义注解
@Scheduled(cron = "0 20 22 * * ?")
@TimedTaskLog(name = "增值业务施工单表重新复制",time = " 22:20:00")//time有空格
public void saveExtFreeWorkClone(){
basicFreeWorkService.updateExtFreeWork();
}
1.3、创建Aspect
import lombok.Setter;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import xhsoft.insurance.base.service.impl.SumUpKeepService;
import xhsoft.utils.XhTimer;
import xhsoft.utils.text.XhLogger;
@Aspect//作用是把当前类标识为一个切面供容器读取
@Component//是一个通用的构造型注解,表明该类是一个 spring 组件
public class TaskRecord {
// 先创建一个方法,方法名随意,但是需要制定@annotation为刚刚自定义的注解
@Setter(onMethod_ = @Autowired)
private transient SumUpKeepService sumUpKeepService;
@Pointcut("@annotation(TimedTaskLog)") //@annotation声明以注解的方式来定义切点
public void taskRecord(){
}
// 使用@Before,需要先引入上面@Pointcut注解的方法名,在加上@annotation,
// @annotation中的值,需要和action方法中的参数名称相同(必须相同,但是名称任意)
@Before("taskRecord() && @annotation(timedTask)")//前置通知
public void checkBefore(TimedTaskLog timedTask){
XhLogger.info(timedTask.name());
}
@After("taskRecord() && @annotation(timedTask)") //后置通知
public void checkAfter(TimedTaskLog timedTask){
String time = XhTimer.date();
String time1 = time+timedTask.time();//拼接执行时间
String time2 = XhTimer.datetime();//定时任务执行完时间
sumUpKeepService.saveTaskRecord(timedTask.name(),time1,time2);//执行记录保存入库
XhLogger.info(timedTask.name()+"END");
}
}
1.4、注解的理解与解释
Java注解是在JDK5时引入的新特性。@interface 可以声明一个你自定义的注解,对于@Target
和@Retention
是由Java提供的元注解,他们的作用是标记其他注解的注解。
@Target 用来约束注解可以应用的地方(如方法、类或字段),其中ElementType是枚举类型,其定义如下,也代表可能的取值范围。
public enum ElementType {
/**标明该注解可以用于类、接口(包括注解类型)或enum声明*/
TYPE,
/** 标明该注解可以用于字段(域)声明,包括enum实例 */
FIELD,
/** 标明该注解可以用于方法声明 */
METHOD,
/** 标明该注解可以用于参数声明 */
PARAMETER,
/** 标明注解可以用于构造函数声明 */
CONSTRUCTOR,
/** 标明注解可以用于局部变量声明 */
LOCAL_VARIABLE,
/** 标明注解可以用于注解声明(应用于另一个注解上)*/
ANNOTATION_TYPE,
/** 标明注解可以用于包声明 */
PACKAGE,
/**
* 标明注解可以用于类型参数声明(1.8新加入)
* @since 1.8
*/
TYPE_PARAMETER,
/**
* 类型使用声明(1.8新加入)
* @since 1.8
*/
TYPE_USE
}
@Retention用来约束注解的生命周期,分别有三个值,源码级别(source),类文件级别(class)或者运行时级别(runtime)
其他的元注解@Documented,作用是:使用 javadoc 工具为类生成帮助文档时是否要保留其注解信息。
@Inherited注解,作用是:使被它修饰的注解具有继承性(如果某个类使用了被@Inherited修饰的注解,则其子类将自动具有该注解)。