2017-06-08 1 views
0

Je voudrais résoudre le problème suivant. Travailler sur un projet de printemps où j'ai une classe de configuration de haricots de printemps. Après que je demande à l'un des clients du conteneur, il retourne avec un client avec underscoreNameFormatter. J'ai essayé de déboguer ceci, et j'ai constaté que le printemps appelle customer.setFormatter seulement une fois pendant le début de l'application et l'origine est ma classe de configuration, donc ça a l'air correct, mais à la fin, quand je récupère mon bean du ctx Méthode .getBean le formater est underscoreNameFormatter dans tous les cas.Spring candidats autowire multiples

Alors est-il même possible de surcharger la valeur injectée?

Note: Avec xml config, il est possible de le faire

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

Répondre

0

Parce que le poseur c.setFormatter(hashmarkNameFormatter()); est appelé dans une classe @Configuration cet appel donnera le grain de Formatter du contexte d'application qui dans votre cas est pas l'objet renvoyé par la méthode hashmarkNameFormatter mais UnderscoreNameFormatter.

Je pense que si vous voulez définir la UnderscoreNameFormatter pour customerUnderscore vous pouvez l'injecter comme paramètre à la méthode de création de haricot customerHashmark en spécifiant le Formatter typé:

Par ex

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

    return c; 
} 
+0

Je ne pense pas que ce serait la raison. Quand j'arrête avec debug sur la ligne 'return c;' et que j'inspecte l'objet, 'hashmarkNameFormatter' est déjà défini. Quelque mécanisme de ressort le remplace par underscoreNameFormatter quelque part plus tard, mais pas par la méthode 'setFormatter' puisqu'il n'y a pas d'autre appel sur cela. J'ai essayé votre solution de toute façon, mais n'a pas fonctionné. La même chose s'est produite, le champ formateur d'objets client fait référence à un objet 'UnderscoreNameFormatter'. – Joooe

0

Nommez tous vos beans et injectez-les avec @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(); 
    } 
} 

Lorsque vous avez besoin d'un client avec HashmarkNameFormatter il vous suffit de faire:

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

Pour Client UnderscoreNameFormatter:

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