2017-05-20 17 views
1

IntelliJ IDEAのサンプルプロジェクトでAspectJを使用しようとしています。私はSpring AOPの経験がありますが、AspectJを初めて使用しているので、動作させることはできません。ここで説明したように、私がやろうとしていますIntelliJ IDEA + AspectJ

https://www.jetbrains.com/help/idea/2017.1/aspectj.html

マイbuild.gradle:

apply plugin: 'java' 

repositories 
{ 
    mavenCentral() 
} 

dependencies 
{ 
    compile "org.projectlombok:lombok:+" 

    compile "org.aspectj:aspectjrt:+" 
    compile "org.aspectj:aspectjweaver:+" 
    compile "org.aspectj:aspectjtools:+" 
} 

buildscript 
{ 
    repositories 
    { 
     maven 
     { 
      url "https://maven.eveoh.nl/content/repositories/releases" 
     } 
    } 

    dependencies 
    { 
     classpath "nl.eveoh:gradle-aspectj:+" 
    } 
} 

project.ext 
{ 
    aspectjVersion = '+' 
} 

apply plugin: 'aspectj' 

マイ側面:

package aspects; 

import lombok.SneakyThrows; 
import lombok.experimental.FieldDefaults; 
import org.aspectj.lang.ProceedingJoinPoint; 
import org.aspectj.lang.annotation.Around; 
import org.aspectj.lang.annotation.Aspect; 

import java.util.Arrays; 

@Aspect 
@FieldDefaults(makeFinal = true) 
public aspect LoggingAspect 
{ 
    Journal journal = Journal.INSTANCE; 

    pointcut all(ProceedingJoinPoint proceedingJoinPoint) : execution(* * set*(..)); 

    around() : all(ProceedingJoinPoint proceedingJoinPoint) 
    { 
     System.out.println("asd"); 
    } 

    @SneakyThrows 
    @Around("execution(* * repository.*.*(..))") 
    public Object log(ProceedingJoinPoint proceedingJoinPoint) 
    { 
     journal.write(proceedingJoinPoint.getThis().getClass().getCanonicalName()); 
     journal.write("\n"); 

     String arguments = Arrays 
      .stream(proceedingJoinPoint.getArgs()) 
      .map(o -> o.getClass().getCanonicalName() + " " + o.toString()) 
      .reduce(new StringBuilder(), StringBuilder::append, StringBuilder::append) 
      .toString(); 

     journal.write(arguments); 
     journal.write("\n"); 

     long start = System.currentTimeMillis(); 

     Object result = proceedingJoinPoint.proceed(); 

     journal.write(result.toString()); 
     journal.write("\n"); 

     journal.write(String.valueOf(System.currentTimeMillis() - start)); 
     journal.write("\n\n"); 
     journal.flush(); 

     return result; 
    } 
} 

Sampleクラス:

package repository; 

import java.io.Serializable; 

public class Task implements Serializable 
{ 
    private static final long serialVersionUID = 1L; 

    enum Status {NEW, IN_PROGRESS, FINISHED}; 

    private Integer id; 
    private String description; 
    private Employee assignee; 
    private Employee reporter; 
    private Status status; 

    public Task(final Integer id, String description, final Employee assignee, final Employee reporter) { 
     this.id = id; 
     this.assignee = assignee; 
     this.reporter = reporter; 
     this.description = description; 
     this.status = Status.NEW; 
    } 

    public Employee getAssignee() { 
     return assignee; 
    } 

    public void setAssignee(Employee assignee) { 
     this.assignee = assignee; 
    } 

... 
} 

私はhav IntelliJ IDEA Ultimate 2017.2では、すべてのメソッド(getterとsetter)が私のポイントカットであることを正しく示唆しています。それはまた、私の側面でアドバイス "ログ"のために複数のポイントカットがあることを私に示唆している。しかし、それは "すべての"アドバイスについてヒントはありません。

(最新バージョンで)私がインストールされている

のプラグインのように: - AspectJのサポート は - AspectJのは をウィーバー - 私はそれを複製しませんでしたので、春AOPは/ AspectJの

@ Gradleのは、このプロジェクトのために自動的に作成されたライブラリの依存関係します。

ビルド> AspectJ製織を有効にしました。

設定>ビルドし、実行、配備>コンパイラ> Javaコンパイラ:

使用コンパイラ:AJCにAJC

パスがコンパイルされます。/home/me/.gradle/caches/modules-2/files-を2.1/org.aspectj/aspectjtools/1.8.10/5c5957ee4615bde33b54ce965f5b85b8827b97d5/aspectjtools-1.8.10.jar

コマンドラインパラメータ:空

デバッグ情報を生成します。

をチェックしますjavacに

委任:

をchcecked注釈処理オプションを有効にする:

プロジェクトのビルドと問題なくコンパイル確認。アスペクトがなく、テンポラリファイルが作成されず、すべてのメソッドが正常に実行されます(ただし、ジョイントポイントを処理していない「すべての」アドバイスでは)。

アドバイスの最初の行にブレークポイントを作成し、デバッガでプロジェクトを実行すると、何も捕らえられません。

私には何が欠けていますか?

答えて

2

さらに多くの時間を無駄にした後、私は2つの異なるAspectJ sytnaxを一緒に混ぜ合わせたことを知りました。

「パブリックアスペクトLoggingAspect」のような側面と、通常のJavaアノテーション(「@Aspect」や「@Around」など)の2つです。

「パブリックアスペクトLoggingAspect」を「パブリッククラスLoggingAspect」に置き換えたときに機能しました。すべてが問題なくコンパイルされているため、見つけ出すのは非常に難しかったです。

誰かがいつか、または少なくとも将来のバージョンのajcでもっと冗長なコンパイラ出力を追加することをお勧めします。