1、切面类加上注解
@Aspect //标注增强处理类(切面类)
@Component //交由Spring容器管理
2、给需要增强的方法添加切面
方式一:在切面类中使用execution给批量方法添加切面
@Around(value = "execution(* com.rq.aop.controller..*.*(..))")
public void processAuthority (ProceedingJoinPoint point)throws Throwable{
方法执行前的逻辑...
//执行方法
point.proceed();
方法执行后的逻辑(在这里可以拿到方法返回的结果)...
}
注:execution的使用
- 任意公共方法的执行:execution(public * *(..))
- 任何一个以“set”开始的方法的执行:execution(* set*(..))
- AccountService 接口的任意方法的执行:execution(* com.xyz.service.AccountService.*(..))
- 定义在service包里的任意方法的执行: execution(* com.xyz.service..(..))
- 定义在service包和所有子包里的任意类的任意方法的执行:execution(* com.xyz.service...(..))
方式二:自定义annotation注解
自定义注解类
package com.rq.aop.common.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)//运行时有效
@Target(ElementType.METHOD)//作用于方法
public @interface MyAnnotation {
String methodName () default "";
}
给controller某个方法添加注解
package com.rq.aop.controller;
import com.rq.aop.common.annotation.MyAnnotation;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/hello")
public class HelloController {
@RequestMapping("/login/{name}")
@MyAnnotation(methodName = "login")
public void login(@PathVariable String name){
System.out.println("hello!"+name);
}
}
//切面类中定义增强,pointcut连接点使用@annotation(xxx)进行定义
@Around(value = "@annotation(around)") //around 与 下面参数名around对应
public void processAuthority(ProceedingJoinPoint point,MyAnnotation around) throws Throwable{
System.out.println("ANNOTATION welcome");
System.out.println("ANNOTATION 调用方法:"+ around.methodName());
System.out.println("ANNOTATION 调用类:" + point.getSignature().getDeclaringTypeName());
System.out.println("ANNOTATION 调用类名" + point.getSignature().getDeclaringType().getSimpleName());
point.proceed(); //调用目标方法
System.out.println("ANNOTATION login success");
}
网友评论