簡體   English   中英

如何創建要由gradle預編譯運行的注釋處理器以向方法添加代碼?

[英]How create annotation processor to be run by gradle pre-compile to add code to methods?

我們有一些代碼需要在許多方法中運行,並且對於我們的開發人員而言,必須一遍又一遍地編寫代碼(這也是一件很乏味的事情(而且我們還希望允許所調用的API能夠更改而不需要更改任何API)。使用它的代碼)。

我們的想法是在調用此代碼的方法上添加自定義注釋,然后編寫自己的注釋處理代碼,該代碼將查找該注釋,然后在編譯之前將代碼添加到方法的末尾(但是當它們看起來在IDE中位於此文件之后的位置,代碼仍然不存在)。

我將如何實現? 我需要做些什么來使Gradle調用它,能夠更改傳遞給編譯器/生成器的方法定義,並能夠讀取方法上的注釋?

(我們使用的是Spring Boot和Gradle,但這可能沒有什么不同)

Spring AOP足以滿足您的要求。

這是一個使您有所了解的小示例:有兩個類,每個類共有三個共同的方法:play(),addPlayer()和gameover(),並且每次調用play方法時,都必須調用該程序一個例程來打印文本,使用AOP,您無需重復相同的代碼。

對於組織順序,我將使用一個接口,該接口不是必需的,但這是一個好習慣:

游戲介面:

public interface Game {
    void play();
    void addPlayer(String name);
    void gameOver();
}

實施比賽的足球課

public class Soccer implements Game {
    @Override
    public void play() {
        System.out.println("Soccer Play started");
    }

    @Override
    public void addPlayer(String name) {
        System.out.println("New Soccer Player added:" + name);
    }

    @Override
    public void gameOver() {
        System.out.println("This soccer Game is Over");
    }
}

實現游戲的棒球課

public class Baseball implements Game {
    @Override
    public void play() {
        System.out.println("Baseball game started at " + new Date());
    }

    @Override
    public void addPlayer(String name) {
        System.out.println("New Baseball Player added: " +name);
    }

    @Override
    public void gameOver() {
        System.out.println("The game is over");
    }
}

現在,當調用play方法時要捕獲的Aspect配置

@Aspect
@Component
public class AspectConfiguration {

    @Before("execution(* org.boot.aop.aopapp.interfaces.Game.play(..))")
    public void callBefore(JoinPoint joinPoint){
        System.out.println("Do this allways");
        System.out.println("Method executed: " + joinPoint.getSignature().getName());
        System.out.println("******");
    }
}

@Before注釋意味着將在執行play方法之前調用該方法。 另外,您還需要指定一個切入點表達式,以告訴Aspect如何匹配您需要觸發的方法調用。 例如,在這種情況下,我們使用play方法,它是切入點表達式: "execution(* org.boot.aop.aopapp.interfaces.Game.play(..))"

最后是Spring Boot Application類:

@EnableAspectJAutoProxy
@SpringBootApplication
public class AopappApplication {

    public static void main(String[] args) {

        Game soccer=null;

        Game baseball=null;

        AnnotationConfigApplicationContext ctx = (AnnotationConfigApplicationContext) SpringApplication.run(AopappApplication.class, args);
        soccer = (Game) ctx.getBean("soccer");
        baseball = (Game) ctx.getBean("baseball");

        soccer.play();
        baseball.play();

        soccer.addPlayer("Player 1");
        soccer.addPlayer("Player 2");

        baseball.addPlayer("Player 23");

        soccer.gameOver();
        baseball.gameOver();
    }

    @Bean("soccer")
    public Game soccer(){
        return new Soccer();
    }

    @Bean("baseball")
    public Game baseball(){
        return new Baseball();
    }
}

有一個關於Spring AOP plese的上帝文檔,請參見以下鏈接。 春季AOP文件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM