2017-06-08 3 views
0

Ich möchte das folgende Problem lösen. Ich arbeite an einem Frühlingsprojekt, bei dem ich eine Spring Bean Konfigurationsklasse habe.Spring mehrere Autowire Kandidaten

Nachdem ich nach einem der Kunden aus dem Container gefragt habe, kehrt er mit einem Kunden mit UnterstrichNameFormatter zurück.

Ich habe versucht, dies zu debuggen, und festgestellt, dass Frühling customer.setFormatter nur einmal während App-Start und der Ursprung ist meine Konfigurationsklasse, so dass das OK aussieht, aber am Ende, wenn ich meine Bohne von der CTX zurück .getBean-Methode Der Formatierer ist in jedem Fall der UnterstrichNameFormatter.

So ist es sogar möglich, den injizierten Wert zu überschreiben?

Hinweis: Mit XML-Konfigurations es möglich ist, diesen

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

Antwort

0

zu tun, weil die Setter c.setFormatter(hashmarkNameFormatter()); in einer @Configuration Klasse aufgerufen wird dieser Aufruf wird die Formatter Bohne aus dem Anwendungskontext, die in Ihrem Fall gesetzt ist nicht das von der hashmarkNameFormatter-Methode zurückgegebene Objekt, sondern UnderscoreNameFormatter.

Ich denke, wenn man die UnderscoreNameFormatter für customerUnderscore festlegen möchten Sie es als Parameter an die Bean-Erzeugungsverfahren customerHashmark injizieren könnte den typisierten Formatter durch Angabe:

Z.B.

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

    return c; 
} 
+0

Ich glaube nicht, wäre dies der Grund sein. Wenn ich mit dem Debugging auf die Zeile 'return c;' stoppe und das Objekt inspiziere, ist der 'hashmarkNameFormatter' bereits gesetzt. Irgendein Mechanismus der Feder ersetzt es irgendwo später zu "UnterstreichenNameFormatter", aber nicht über 'setFormatter'-Methode, da es keinen weiteren Aufruf darauf gibt. Ich habe Ihre Lösung trotzdem versucht, aber nicht funktioniert. Das gleiche passiert, das Formatierungsfeld der Kundenobjekte referenziert auf ein 'UnderscoreNameFormatter'-Objekt. – Joooe

0

Benennen Sie alle Ihre Bohne und injizieren Sie sie mit @Qualifier.

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(); 
    } 
} 

Wenn Sie einen Kunden mit HashmarkNameFormatter benötigen müssen Sie nur tun:

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

Für Kunden mit UnderscoreNameFormatter:

@Autowired 
@Qualifier("underscoreNameCustomer") 
Customer customer2; 
Verwandte Themen