[英]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.