2017-04-08 15 views
2

は、私は次のコードでBeanを初期化していたとしますBean内からBeanメソッドのアノテーションに到達することはできますか?

@Configuration 
MyConfig { 
    @Bean 
    @MyAnnotation // how to know this from bean constructor or method? 
    MyBean myBean() { 
     MyBean ans = new MyBean(); 
     /// setup ans 
     return ans; 
    } 
} 

私は豆のコンストラクタをwithingからか、Beanのメソッドの何かについて@MyAnnotation注釈をwithingから知っていることはできますか?

myBean()の方法ではありませんが、それは明らかです。

+0

「何か」とはどういう意味ですか?注釈はランタイムの保存注釈ですか? 'MyBean'は' MyConfig'に関する情報を持っていますか、それを知っていなくても注釈について知っていると思いますか? – RealSkeptic

+0

@RealSkeptic(1)「何か」とは、アノテーションの存在とそのパラメータを意味します。 (2)アノテーションは必要に応じて「良い」ものであり、間違いなくランタイムです(3)no(4)注釈付きの設定から豆をインスタンス化し、注釈から情報を取り込み、豆 – Dims

答えて

1

まあ、それはおそらく最高の、あるいは正しい方法ではないのですが、私の最初の推測では、現在のスタックトレースを使用することであり、私のために働くようだ:

package yourpackage; 

import java.lang.annotation.Annotation; 
import java.lang.reflect.Method; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

public class AspectJRawTest { 

    public static void main(String[] args) { 
     System.out.println("custom annotation playground"); 

     ISomething something = new SomethingImpl(); 

     something.annotatedMethod(); 
     something.notAnnotatedMethod(); 
    } 

} 

interface ISomething { 
    void annotatedMethod(); 

    void notAnnotatedMethod(); 
} 

class SomethingImpl implements ISomething { 
    @MyCustomAnnotation 
    public void annotatedMethod() { 
     System.out.println("I am annotated and something must be printed by an advice above."); 
     CalledFromAnnotatedMethod ca = new CalledFromAnnotatedMethod(); 
    } 

    public void notAnnotatedMethod() { 
     System.out.println("I am not annotated and I will not get any special treatment."); 
     CalledFromAnnotatedMethod ca = new CalledFromAnnotatedMethod(); 
    } 
} 

/** 
* Imagine this is your bean which needs to know if any annotations affected it's construction 
*/ 
class CalledFromAnnotatedMethod { 
    CalledFromAnnotatedMethod() { 
     List<Annotation> ants = new ArrayList<Annotation>(); 
     for (StackTraceElement elt : Thread.currentThread().getStackTrace()) { 
      try { 
       Method m = Class.forName(elt.getClassName()).getMethod(elt.getMethodName()); 
       ants.addAll(Arrays.asList(m.getAnnotations())); 
      } catch (ClassNotFoundException ignored) { 
      } catch (NoSuchMethodException ignored) { 
      } 
     } 
     System.out.println(ants); 
    } 
} 

出力は明らかに私は私のへのアクセスを得たことを示しています注釈付きメソッドから呼び出されたオブジェクトのコンストラクタ内の注釈:

custom annotation playground 
I am annotated and something must be printed by an advice above. 
[@yourpackage.MyCustomAnnotation(isRun=true)] 
I am not annotated and I will not get any special treatment. 
[] 
関連する問題