2017-05-09 4 views
0

J'ai un composant EmbeddedRedis qui dépend d'un objet de configuration RedisConfig analysé à partir du fichier de propriétés de l'application. Il existe différents fichiers de propriétés, correspondant aux profils d'application possibles pouvant être exécutés. Ainsi, lorsqu'il est exécuté dans le profil master, le composant EmbeddedRedis sera approvisionné conformément au profil master.Spring Boot - Composant Autowire utilisant différents profils

Dans une classe de test, supposée mettre en place un cluster Redis local, il faut également Redis objets provisionnés en fonction de tous les autres profils. J'ai esquissé mon idée ci-dessous en utilisant l'annotation @Qualifier, qui n'apporte pas le résultat souhaité.

@Autowired @Qualifier("dev-cluster-master") 
private Redis embeddedRedisMaster; 

@Autowired @Qualifier("dev-cluster-slave-001") 
private Redis embeddedRedisSlave1; 

@Autowired @Qualifier("dev-cluster-slave-002") 
private Redis embeddedRedisSlave2; 

Comment puis-je archiver le résultat souhaité dans Spring Boot? Si cela ne fonctionne pas directement, cela suffira-t-il également pour obtenir les objets de configuration mentionnés ci-dessus analysés à partir des différents fichiers de propriétés.

@Component 
@ConfigurationProperties(prefix = "spring.redis") 
public class RedisConfig { 
.... 
} 

Merci d'avance!

Répondre

0

Vous pouvez faire quelque chose comme ceci: Considérez-vous une définition de classe (Redis dans votre exemple)

public class CustomService { 

    private String name; 

    public CustomService(String name){ 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

Et une classe de configuration comme:

@Configuration 
public class Config { 

    @Bean 
    @Profile("master") 
    CustomService serverConfig1(){ 
     CustomService service1 = new CustomService("master"); 
     return service1; 
    } 

    @Bean 
    @Profile("slave") 
    CustomService serverConfig2(){ 
     CustomService service1 = new CustomService("slave"); 
     return service1; 
    } 
} 

qui initient 2 objets différents en fonction sur le profil actif actuel. Si le profil actif actuel est "maître", alors serverConfig1() sera exécuté, sinon serverConfig2().

Et enfin autowired votre service/objet comme celui-ci:

@Autowired 
CustomService service; 

Cette volonté dépend de la définition ci-dessus bean exécuté dans le fichier de configuration.

Et fichier propriété devrait ressembler à ceci:

spring.profiles.active=slave 

Ainsi, dans cet exemple, après l'exécution de code ci-dessus, la valeur du « nom » dans CustomService service; sera « esclave » au lieu de « maître », car en cours le profil actif est "slave" et donc "serverConfig2()" sera exécuté

+0

Salut Afridi, merci pour votre réponse mais je ne comprends pas très bien. L'extrait de code ne compile même pas, car l'annotation @Profile n'est pas applicable aux champs. – twiechert

+0

Oh désolé, l'annotation @Profile ("master") ne peut être utilisée qu'avec la méthode pas avec des champs. Donc, cette annotation devrait être ajoutée sur la méthode de votre définition de bean pour Redis. Alors pouvez-vous poster vos définitions de bean pour chacune des configurations de Redis? après que le printemps va initialiser le haricot spécifique sur la base du profil actif – Afridi

+0

Vérifier ma réponse mise à jour – Afridi