2016-05-14 5 views
3

私は注釈を使用する大きなスプリングWebアプリケーションを持っています。しかし、@コンポーネント/サービスで注釈が付けられているが、呼び出された場所から自動実行されないクラスもあります。代わりに、新しい演算子が使用されます。@Autowired以外のすべてのクラスを見つける

new演算子が使用されているユーザー定義クラスのインスタンスをすべて探したいとします。

基本的には、新しいHttpラッパークラス(springコンポーネント)を作成しました。アプリケーションの複数の場所から呼び出すようにしています。チェーンの先頭からのクラスとクラスは、スプリングで管理されているため、自動配線が機能するため、いくつかの場所で動作します。しかし、呼び出し元チェーン内のクラスの1つがnewを使用してインスタンス化され、スプリング管理されていないため、一部の場所では機能しません。だから、私はこれを修正し、そのようなクラスを春に管理するようにしたい。

私は100種類のクラスについて話していますので、3〜4時間後に行うことができるツールや方法を提案し、人為的ミスを防ぎます。私は日食を使う。

例:

@Component 
public class MyHttpClient { 

    public int execute() { 
     ... 
    } 
} 

@Component 
public class UtilC { 

    @Autowired 
    private MyHttpClient client; 

    public int methodC() { 
     // When methodC is called from A, it works 
     // but when called from B, it gives NullPointerException 
     client.execute(); 
    } 
} 

@Component 
public class UtilB { 

    private UtilC c = new UtilC(); 

    public int methodB() { 
     c.methodC(); 
    } 
} 

@Component 
public class UtilA { 

    @Autowired 
    private UtilC c; 

    public int methodA() { 
     c.methodC(); 
    } 
} 

この提案しないでください。私は見つけるために、新しいUtilC

+0

は、彼らがうまくなるようにSomeService' 'のような名前が付けられます(ただし、コンテナを実行時に、もちろん、反射的にそれを呼び出すことができます)@XmlRootElement用法でアノテートされたクラスのctorのためのエラーを作成することができますあなたは正規表現を書くことができますか? – ChiefTwoPencils

+1

コール階層(Ctrl-Alt-H)は、コンストラクタを誰が呼び出すかを教えてくれませんか?オブジェクトがSpringで管理されていると想定されている場合、Spring以外のコンストラクタを呼び出す必要はありません。これは、Springがリフレクションを使用して表示するため表示されません。 Call Hierarchyを使用するコンストラクタがない場合は、一時的に作成します。 – Andreas

+0

いいえ、それらの正規表現を書くように定義されていません。新しい演算子を使用するeclipseのユーザー定義クラスのインスタンス変数を検索できますか? –

答えて

0

使用Google reflectionのようにインスタンス化されているすべてのユーザが定義したクラスを検索するにはどうすればよい

@Component 
public class UtilC { 

    @Autowired 
    private MyHttpClient client; 

    public int methodC() { 
     try { 
      client.execute(); 
     } catch(NullPointerException npe) { 
      new MyHttpClient.execute(); 
     } 
    } 
} 

@Autowired

で注釈を付けられたすべてのクラス

Setにはクラスが存在しないため、注釈は付いていません。

+0

私は、セットに存在しないすべてのユーザ定義クラスを知る必要があります。 –

+0

私のアプリケーションですべてのユーザ定義クラスをリストする方法はありますか?そして、私はセットにあるものと比較することができます。彼らがセットに含まれていない場合、それはautowiredされていないことを意味しますか? –

0

「アノテーションを使用する大きなスプリングWebアプリケーション」がある場合は、適切なJava IDEを使用している必要があります。すべてのIDEには、「Find Usages」(または類似のもの)という機能があります。あなたはそれを使うべきです。例えば

は、のIntelliJ IDEAで、ここで私はそれを行うだろう方法は次のとおりです。

  1. は、(ソースコード内の)Autowiredインターフェイスを探します。 「用途の検索」を使用します。 enter image description here
  2. これは用途を示しているはずです(種類の使い方できれいに分類されています)。 enter image description here
+0

これは私にautowiredクラスを与えます。それはどのように私に新しいオペレータを使用してインスタンス化されたユーザ定義のクラスを与えるだろう –

0

この問題を解決するには、aspectj(コンパイル時織り)を使用する方法があります。例えば以下の側面コンパイラが

import javax.xml.bind.annotation.XmlRootElement; 

public aspect CtorError { 

    declare error : call ((@XmlRootElement *).new(..)) : "ctor called"; 
} 
関連する問題