Java自定義註解和AOP的整合

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


}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章