2016-09-21 9 views
2

作成したのと同じタイプの2つの豆との構成以下を検討:コンパイル時にパラメータの名前が失われた場合、Springはパラメータ名によってどのように自動配線しますか?

@Configuration 
@ComponentScan(basePackageClasses = TwoStrings.class) 
public class Config { 

    @Bean 
    public String one() { 
     return "one"; 
    } 

    @Bean 
    public String two() { 
     return "two"; 
    } 

} 

上記コンポーネントスキャンによって作成された2つのBeanに依存する別のBean:ローカル変数/パラメータの

@Component 
public class TwoStrings { 

    public final String a; 
    public final String b; 

    @Autowired 
    public TwoStrings(String one, String two) { 
     this.a = one; 
     this.b = two; 
    } 

} 

名コンパイル時に失われ、実行時には使用できませんされています

enter image description here

しかし、Springは何とか2つのString beanを正確に自動生成します。

one 
two 

コンストラクタのパラメータの名前が失われる考えると、私は春が春、タイプStringの1つの以上のBeanがあるという例外をスローするために期待される

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = Config.class) 
public class Example { 

    @Autowired 
    private TwoStrings twoStrings; 

    @Test 
    public void test() { 
     System.out.println(twoStrings.a); 
     System.out.println(twoStrings.b); 
    } 

} 

プリント以下の例のテスト何らかの形でパラメータ名を使ってBeanをオートワイヤします。

Springはコンストラクタパラメータの名前をどのように知っていますか?

答えて

6

この場合、スプリングはusing debug informationです。デバッグ情報なしでコードをコンパイルした場合、つまり-g:noneフラグがjavacの場合、エラーになります。 documentationから

エキス:

春はコンストラクタから パラメータ名を検索できるように箱から出して、この作品を作るためにあなたのコードが有効になってデバッグフラグを をコンパイルする必要があることに注意してください。コード をデバッグフラグでコンパイルできない場合(またはしたくない場合)@ConstructorProperties JDKアノテーションを使用して、コンストラクタ引数を明示的に指定します。

のJava 8はReflection APIを使用してこの情報を読み取るための方法を導入していますが、クラスは、デバッグフラグは何javac

+0

-parametersフラグを指定してコンパイルする必要がありますか?これはVMオプションではありません。 IntelliJでどのように制御できますか? –

+0

@JaroslawPawlakデフォルトで有効になっています - IntelliJではSettings \ Build、Execution、Deployment \ Compiler \ Java Compiler \ Debugging情報を生成します – bedrin

+0

Springはどのようにこれらのデバッグ情報にアクセスしますか?リフレクションAPIはできません。 –

関連する問題