第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

攔截 Spring AOP 或 AspectJ 中帶注解的類和方法

攔截 Spring AOP 或 AspectJ 中帶注解的類和方法

GCT1015 2023-01-05 17:01:22
所以我有一個(gè)自定義注釋@Target({ElementType.METHOD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Inherited@Documentedpublic @interface Intercepted {}我想用它來(lái)將方面編織到方法中(AspectJ,@annotation(Intercepted))。這個(gè)想法是,當(dāng)我@Intercepted直接注釋方法時(shí),我將方面編織進(jìn)去——那部分工作——或者如果我注釋類,應(yīng)該將方面編織到它的所有(公共)方法中——那部分不起作用。此外,如果我注釋一個(gè)類及其方法之一,則方面應(yīng)該只編織一次,方法級(jí)別的注釋覆蓋類級(jí)別的注釋。本質(zhì)上,我想要一個(gè)“如果有類級(jí)注釋,則添加類級(jí)注釋,但前提是還沒(méi)有方法級(jí)注釋”。我怎么做?
查看完整描述

1 回答

?
白豬掌柜的

TA貢獻(xiàn)1893條經(jīng)驗(yàn) 獲得超10個(gè)贊

這是一個(gè) AspectJ 示例。切入點(diǎn)語(yǔ)法在 Spring AOP 中是相同的。


幫助類:


package de.scrum_master.app;


import java.lang.annotation.*;


@Target({ElementType.METHOD, ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Inherited

@Documented

public @interface Intercepted {}

package de.scrum_master.app;


@Intercepted

public class AnnotatedClass {

  public void doSomething() {}

  public void doSomethingElse() {}

}

package de.scrum_master.app;


public class AnnotatedMethod {

  @Intercepted

  public void doSomething() {}

  public void doSomethingElse() {}

}

package de.scrum_master.app;


@Intercepted

public class AnnotatedMixed {

  @Intercepted

  public void doSomething() {}

  public void doSomethingElse() {}

}

驅(qū)動(dòng)程序應(yīng)用程序(Java SE,無(wú) Spring):


package de.scrum_master.app;


public class Application {

  public static void main(String[] args) {

    // Should be logged

    new AnnotatedClass().doSomething();

    // Should be logged

    new AnnotatedClass().doSomethingElse();


    // Should be logged

    new AnnotatedMethod().doSomething();

    // Should NOT be logged

    new AnnotatedMethod().doSomethingElse();


    // Should be logged, but only once

    new AnnotatedMixed().doSomething();

    // Should be logged

    new AnnotatedMixed().doSomethingElse();

  }

}

方面:


請(qǐng)注意,該execution(* *(..)) &&部分在 Spring AOP 中不是必需的,因?yàn)槟抢飪H支持方法執(zhí)行連接點(diǎn)。切入點(diǎn)可能就在annotatedMethod() || annotatedClass()那里。在 AspectJ 中,我必須更加精確,否則會(huì)記錄其他連接點(diǎn)類型。


package de.scrum_master.aspect;


import org.aspectj.lang.JoinPoint;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Before;

import org.aspectj.lang.annotation.Pointcut;


@Aspect

public class AnnotationInterceptor {

  @Pointcut("@annotation(de.scrum_master.app.Intercepted)")

  public void annotatedMethod() {}


  @Pointcut("@within(de.scrum_master.app.Intercepted)")

  public void annotatedClass() {}


  @Before("execution(* *(..)) && (annotatedMethod() || annotatedClass())")

  public void log(JoinPoint thisJoinPoint) {

    System.out.println(thisJoinPoint);

  }

}

控制臺(tái)日志:


execution(void de.scrum_master.app.AnnotatedClass.doSomething())

execution(void de.scrum_master.app.AnnotatedClass.doSomethingElse())

execution(void de.scrum_master.app.AnnotatedMethod.doSomething())

execution(void de.scrum_master.app.AnnotatedMixed.doSomething())

execution(void de.scrum_master.app.AnnotatedMixed.doSomethingElse())


查看完整回答
反對(duì) 回復(fù) 2023-01-05
  • 1 回答
  • 0 關(guān)注
  • 224 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)