需求背景:在一个login放发的前后增加一些逻辑处理,采用AOP和自定义注解的方式。
创建一个注解类,标记login()方法。
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Login {
String value() default "";
}
public interface LoginService {
void login();
}
在login方法上用上注解
@Service
public class LoginServiceImpl implements LoginService {
@Override
@Login // 使用注解
public void login() {
System.out.println("这里执行各种login的逻辑代码");
}
}
Aspect类。
@Aspect
@Component
public class LoginAspect {
//通过注解找到有这个注解的方法,并对这个方法的前前后后做一些操作。
@Before(value = "@annotation(Login)")
private void beforeLogin() {
System.out.println("在登录之前的一些操作");
}
//可以在方法里添加注解作为参数,通过参数获取注解的数据
@After(value = "@annotation(login)")
private void afterLogin(Login login) {
System.out.println("在登录之后的一些操作");
String annoVal = login.value();
}
@Around(value = "@annotation(Login)")
private Object around(ProceedingJoinPoint point) throws Throwable {
long start = System.currentTimeMillis();
Object obj = point.proceed(); // 执行真正的方法
long end = System.currentTimeMillis();
//通过获取Method和getAnnotation的方法,拿到注解,获取注解里的数据
MethodSignature methodSignature = (MethodSignature)point.getSignature();
Method method = methodSignature.getMethod();
Login login = method.getAnnotation(Login.class);
String annoVal = login.value();
return obj;
}
}
通过controller调用login方法,查看结果。
@RestController
public class LoginController {
@Autowired
LoginService loginService;
@RequestMapping("/login")
public String login() {
loginService.login();
return "";
}
}