自定义注解实战(一)

利用AOP实现注解

个人见解:使用aop最大的好处是不侵入业务代码,就可以在方法执行前或者执行后来实现某些功能,比如日志打印,权限处理等等。正是因为不侵入代码的特性,我们不建议利用aop去截断请求(request),返回包含错误信息的响应(response)。其实我之前有这么做过,自定义权限注解,用户没有权限的话,直接返回没有权限的错误信息(response),功能上可以实现,虽然给我抛异常了,有代码洁癖的我就只能使用拦截器的方法实现该注解了,利用拦截器实现注解将在 自定义注解实战(二) 中来介绍,本篇介绍利用aop来实现注解——当说明书来看吧。。。

自定义注解

我们先定义一个MyAnno的注解,代码如下:

1
2
3
4
5
6
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface MyAnno {
String value();
}

其中,@Target(ElementType.METHOD) 定义该注解作用在方法上,使用value()我们在写注解@MyAnno的时候可以直接@MyAnno("msg"),如果你按照下面的代码来定义注解的话,

1
2
3
public @interface MyAnno {
String param();
}

那你使用注解的时候就只能@MyAnno(param = "msg")了,不管是@MyAnno("msg"),还是@MyAnno(param = "msg"),括号里面都要写value的,如果你定义的注解不需要写的话,那么就在定义的时候加上 default "";,如下:

1
2
3
public @interface MyAnno {
String param() defaul "";
}

实现注解

按照上面定义完注解其实已经可以使用了,但是没什么功能,如果想让我们自定义的注解work起来,需要利用到Aspectj:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Aspect
@Component
public class RealizationMyAnno {

@Pointcut("@annotation(com.bfh.annotation.MyAnno)")
public void MyMethod(){}

@After("MyMethod()")
public void doAfterReturning(JoinPoint joinPoint){

System.out.println("RealizationMyAnno.doAfterReturning()");

String targetName = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
Object[] params = joinPoint.getArgs();

// 实际开发过程中使用log打印
System.out.println("targetName:" + targetName);
System.out.println("methodName:" + methodName);

}
}

这时候我们可以将我们自定义的注解加在方法上了,当程序执行到该方法时,就会打印一些信息,如果targetName,methodName,你也可以做些其他的事情,比如自动打印日志,自动将日志输出到硬盘上等等。。。

补充:其实利用aop去截断request请求也是可以的(如果必须的话),利用异常来截断请求,然后设置统一异常处理,向前端返回错误信息,不过不推荐用异常来处理业务。。。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×