java-自定义注解
概述:本章简述自定义注解及实现,写完会对IOC与AOP有深刻的理解。感觉注解不再神秘。
1:理解:从简单的应用层面来说,分2步。
第一步:定义一个注解,这个注解中可以有不同的属性。可以理解是我要带的参数。
第二步:写一个拦截,即AOP。拦截请求,然后判断是否存在这个注解,如果存在我们可以写我们的逻辑了。
总结:举例我们要执行一个action前需要获取这个用户的登录信息。比较笨的方法是写一个获取登录信息的方法,然后每个action代码的最前面执行这个方法。
而我们可以使用自定义注解完成这个事,第一步就是方法的入口。第二步就是方法的实现。
2:实现。
第一步:定义注解入口。
@Target(ElementType.METHOD) //作用域:类,方法等 @Retention(RetentionPolicy.RUNTIME) //生命周期:程序在运行时有效 @Documented public @interface Test { String value() default ""; //可以传value值,不传默认是"" }
第二步:定义AOP。
@Aspect //切面类 @Component public class TestAop { /** * 定义切点 * @param test * within(org.springframework.web.bind.annotation.RestController *) 表示拦截所有引入RestController注解的 * @annotation(test) 表示包含 test注解的 * execution(* *(..)) 表示可以有任意返回值,任意路径,任意参数 */ @Pointcut("within(org.springframework.web.bind.annotation.RestController *) && " + "@annotation(test) && execution(* *(..))") private void pointCut(Test test) { } /** * before拦截,一般用于身份验证,数据拦截等 */ @Before("pointCut(test)") private void before(JoinPoint joinPoint,Test test) { //具体的处理逻辑 String value = test.value(); //可以获取注解传入的值 Object[] args = joinPoint.getArgs(); //获取方法传入的信息 for (Object obj : args) { //可以获取HttpServletRequest if(obj instanceof HttpServletRequest) { HttpServletRequest req = (HttpServletRequest) obj; } } } }
@After
引入这个注解的方法执行之后要做的处理。
@Around
引入这个注解的方法执行中做的处理,比如可以做日志处理。
3:补充
3.1 AOP的5种通知及区别
before(前置通知)在目标方法调用之前执行;
afterReturning(后置通知)在目标方法调用之后执行,一旦目标方法产生异常不会执行;
after(最终通知)在目标调用方法之后执行,无论目标方法是否产生异常,都会执行;
afterThrowing(异常通知)在目标方法产生异常时执行;
around(环绕通知)在目标方法执行之前和执行之后都会执行,可以设定目标方法是否执行;