2017-06-08 7 views
0

私は以下の問題を解決したいと思います。 Spring Bean設定クラスがあるSpringプロジェクトで作業する。複数のautowire候補のスプリング

package package.bean_config_java; 


@Configuration 
@ComponentScan("package.bean_config_java") 
public class Beans { 

    @Bean 
    public Customer customerHashmark() { 
    Customer c = new Customer(); 
    c.setFormatter(hashmarkNameFormatter()); 

    return c; 
    } 

    @Bean 
    public Customer customerUnderscore() { 
    Customer c = new Customer(); 
    c.setFormatter(underscoreNameFormatter()); 

    return c; 
    } 

    @Bean 
    public Formatter hashmarkNameFormatter() { 
    return new HashmarkNameFormatter(); 
    } 

    @Primary 
    @Bean 
    public Formatter underscoreNameFormatter() { 
    return new UnderscoreNameFormatter(); 
    } 
} 

コンテナから顧客のいずれかを尋ねた後、underscoreNameFormatterを使用して得意先と返品します。

私はこれをデバッグしようとしましたが、春はappの開始時に一度だけcustomer.setFormatterを呼び出すことがわかりました。元は私の設定クラスですから、okですが、結局、ctx .getBeanメソッドformaterはすべてのケースでunderscoreNameFormatterです。

注入された値を無効にすることもできますか?

注:XMLをはセッターc.setFormatter(hashmarkNameFormatter());がこの呼び出しはあなたのケースであるアプリケーションコンテキストからフォーマッタBeanを設定します@Configurationクラスで呼び出されているので、それはこの

<bean class="package.Customer"> 
    <property name="formatter"> 
    <bean class="package.HashmarkNameFormatter" /> 
    </property> 
</bean> 

答えて

0

を行うことが可能のconfig hashmarkNameFormatterメソッドが返すオブジェクトではなく、UnderscoreNameFormatterを返します。

私はあなたがcustomerUnderscoreためUnderscoreNameFormatterを設定したい場合は、型指定されたフォーマッタを指定することにより、customerHashmark豆の作成方法にパラメータとして、それを注入できると思います。例えば

@Bean 
public Customer customerHashmark(HashmarkNameFormatter hashmarkNameFormatter) { 
    Customer c = new Customer(); 
    c.setFormatter(hashmarkNameFormatter); 

    return c; 
} 
+0

は、私はこれが理由だろうとは思いません。 'return c;'行でデバッグを止め、オブジェクトを調べると 'hashmarkNameFormatter'がすでに設定されています。スプリングのメカニズムによっては後でどこかで 'underscoreNameFormatter'に置き換えられますが、' setFormatter'メソッドでは呼び出されません。 私はあなたのソリューションをとにかく試みましたが、うまくいきませんでした。同じことが起こりました。顧客オブジェクトのフォーマッタフィールドが 'UnderscoreNameFormatter'オブジェクトを参照しています。 – Joooe

0

すべてのBeanに名前を付けて、それらに@Qualifierを挿入します。あなたはHashmarkNameFormatterとお客様が必要な場合

package package.bean_config_java; 

@Configuration 
@ComponentScan("package.bean_config_java") 
public class Beans { 

    @Bean(name="hashmarkNameCustomer") 
    public Customer customerHashmark() { 
    Customer c = new Customer(); 
    c.setFormatter(hashmarkNameFormatter()); 

    return c; 
    } 

    @Bean(name="underscoreNameCustomer") 
    public Customer customerUnderscore() { 
    Customer c = new Customer(); 
    c.setFormatter(underscoreNameFormatter()); 

    return c; 
    } 

    @Bean 
    public Formatter hashmarkNameFormatter() { 
    return new HashmarkNameFormatter(); 
    } 

    @Primary 
    @Bean 
    public Formatter underscoreNameFormatter() { 
    return new UnderscoreNameFormatter(); 
    } 
} 

あなただけしなければならない。UnderscoreNameFormatterと顧客のために

@Autowired 
@Qualifier("hashmarkNameCustomer") 
Customer customer1; 

@Autowired 
@Qualifier("underscoreNameCustomer") 
Customer customer2; 
関連する問題