2016-09-14 20 views
0

特定の注釈を持つフィールドをキャプチャすることは可能ですか?私の最終目標は、そのフィールドに値を注入することですが、私のポイントカットは間違っています(正しい構文がわからない)。Spring AOP注釈付きフィールドのポイントカット式

@Pointcut("execution(* *(..)) && @annotation(com.mycompany.MyAnnotation)") 
private void annotatedField(){} 

@Around("annotatedField()") 
public Object injectValue(final ProceedingJoinPoint proceedingJoinPoint) throws Throwable {} 

私は、ポイントカットがアノテーションを持つメソッドを記述していると思います。私はそれをどのフィールドも言うように変更したい。

+2

あなたが_captureことにより、任意のfield_何を意味するのですか? Spring(プロキシベース)AOPは、メソッド呼び出しをインターセプトするだけで動作します。 –

+0

優れた点。だから、おそらく私の方法論は、そのフィールドのセッターメソッド上のポイントカットを持っている必要がありますか? – Mostfoolish

+0

あなたは_inject_を挙げました。組み込みのautowiringメカニズムを使用してみませんか? –

答えて

0

私はSotirios Delimanolisのアドバイスに従い、Springオンボード手段でできるだけ取得する必要があると思います。それでもあなたがまだ不十分であり、あなたのアイデアを実装するために側面を絶対に使いたいと思えば、Spring AOPの代わりにAspectJ within Springを使用して、get()set()のようなポイントカットの全機能を利用して、クラスメンバの読み込み/静的および非静的の両方)。例えば:

マーカー注釈:

package de.scrum_master.app; 

import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.FIELD) 
public @interface MyAnnotation {} 

ドライバアプリケーション:

アプリケーションが(toString())を読み出し、それらの間で注釈を付け、(コンストラクタ、メイン方法)すべてのフィールドを書き込むstatusフィールド。

package de.scrum_master.app; 

public class Application { 
    private int id; 
    private String name; 
    @MyAnnotation private String status; 

    public Application(int id, String name, String status) { 
     this.id = id; 
     this.name = name; 
     this.status = status; 
    } 

    @Override 
    public String toString() { 
     return "Application [id=" + id + ", name=" + name + ", status=" + status + "]"; 
    } 

    public static void main(String[] args) { 
     Application application = new Application(11, "AspectJ demo", "starting"); 
     System.out.println(application); 
     application.id = 22; 
     application.name = "AspectJ field access demo"; 
     application.status = "running"; 
     System.out.println(application); 
     application.status = "shutting down"; 
     System.out.println(application); 
     application.status = "stopped"; 
     System.out.println(application); 
    } 
} 

アスペクト比:

package de.scrum_master.aspect; 

import org.aspectj.lang.JoinPoint; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Before; 

@Aspect 
public class AnnotatedFieldAspect { 
    @Before("get(* *) && @annotation(de.scrum_master.app.MyAnnotation)") 
    public void interceptRead(JoinPoint thisJoinPoint) { 
     System.out.println(thisJoinPoint); 
    } 

    @Before("set(* *) && @annotation(de.scrum_master.app.MyAnnotation) && args(newValue)") 
    public void interceptWrite(JoinPoint thisJoinPoint, Object newValue) { 
     System.out.println(thisJoinPoint + " -> " + newValue); 
    } 
} 

コンソールログ:

set(String de.scrum_master.app.Application.status) -> starting 
get(String de.scrum_master.app.Application.status) 
Application [id=11, name=AspectJ demo, status=starting] 
set(String de.scrum_master.app.Application.status) -> running 
get(String de.scrum_master.app.Application.status) 
Application [id=22, name=AspectJ field access demo, status=running] 
set(String de.scrum_master.app.Application.status) -> shutting down 
get(String de.scrum_master.app.Application.status) 
Application [id=22, name=AspectJ field access demo, status=shutting down] 
set(String de.scrum_master.app.Application.status) -> stopped 
get(String de.scrum_master.app.Application.status) 
Application [id=22, name=AspectJ field access demo, status=stopped] 
関連する問題