在Spring中使用自定义注解的本质就是使用Spring 的 AOP编程。
首先创建一个注解
@interface
import org.springframework.data.mongodb.core.mapping.Document;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Document
public @interface Zhangxueliang {
String value();
}
编写一个切面类,获取注解
@Zhangxueliang
信息,并对@Zhangxueliang
标注的方法进行切面编程
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
/**
* @ProjectName springbootdemo_src
* @ClassName AnnotationAspect
* @Desicription TODO
* @Author Zhang Xueliang
* @Date 2019/5/15 11:23
* @Version 1.0
**/
@Aspect
@Component
@Slf4j
public class AnnotationAspect {
@Pointcut("@annotation(com.zhangxueliang.demo.springbootdemo.annotation.Zhangxueliang)")
public void annotationPointCut() {
}
@Before("annotationPointCut()")
public void before(JoinPoint joinPoint){
MethodSignature sign = (MethodSignature)joinPoint.getSignature();
Method method = sign.getMethod();
Zhangxueliang annotation = method.getAnnotation(Zhangxueliang.class);
System.out.println("打印:"+annotation.value()+" 开始前");
}
@Around("annotationPointCut()")
public Object advice(ProceedingJoinPoint joinPoint){
System.out.println("通知之开始");
Object resultMsg=null;
try {
resultMsg=joinPoint.proceed();
System.err.println("++++++++"+resultMsg);
log.info("==============可以应用于日志打印==============> "+resultMsg.toString());
} catch (Throwable e) {
e.printStackTrace();
}
System.out.println("通知之结束");
return resultMsg;
}
@After("annotationPointCut()")
public void after() {
System.out.println("after方法执行后");
}
}
测试注解
@Zhangxueliang
的使用
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
/**
* @ProjectName springbootdemo_src
* @ClassName Test
* @Desicription TODO
* @Author Zhang Xueliang
* @Date 2019/5/15 11:26
* @Version 1.0
**/
@SpringBootApplication
@RestController
//@EnableAspectJAutoProxy
public class Test {
public static void main(String[] args) {
SpringApplication.run(Test.class, args);
}
@RequestMapping("/annotation")
@Zhangxueliang("测试注解1")
public List<String> getById() {
System.err.println("o+++++++++++++++++");
List<String> list = new ArrayList<String>();
list.add("1");
list.add("qwe");
list.add("asd");
return list;
}
}