需求背景:在一個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 "";
}
}