web-dev-qa-db-fra.com

Création conditionnelle de haricots de printemps

J'ai une question sur les configurations d'annotation Spring. J'ai un haricot:

@Bean 
public ObservationWebSocketClient observationWebSocketClient(){
    log.info("creating web socket connection...");
    return new ObservationWebSocketClient();
}

et j'ai un dossier de propriété:

@Autowired
Environment env;

Dans le fichier de propriétés, je veux avoir une propriété booléenne spéciale

createWebsocket=true/false

qui signe si un bean ObservationWebSocketClient doit être créé. Si la valeur de la propriété est false, je ne veux pas du tout établir de connexion de socket Web.

Y a-t-il une possibilité technique de réaliser cela?

37
user2957954

Bien que je n'aie pas utilisé cette fonctionnalité, il semble que vous puissiez le faire avec les ressorts 4 @Conditional annotation .

Créez d'abord une classe Condition, dans laquelle ConditionContext a accès à Environment:

public class MyCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, 
                           AnnotatedTypeMetadata metadata) {
        Environment env = context.getEnvironment();
        return null != env 
               && "true".equals(env.getProperty("createWebSocket"));
    }
}

Annotez ensuite votre bean:

@Bean
@Conditional(MyCondition.class)
public ObservationWebSocketClient observationWebSocketClient(){
    log.info("creating web socket connection...");
    return new ObservationWebSocketClient();
}

modifier Le spring-boot annotation @ConditionalOnProperty a implémenté ceci de manière générique; le code source du Condition utilisé pour l'évaluer est disponible sur github ici pour les personnes intéressées. Si vous avez souvent besoin de cette fonctionnalité, il serait préférable d'utiliser une implémentation similaire plutôt que de faire beaucoup d'implémentations Condition personnalisées.

51
beerbajay

Annotez votre méthode de bean avec @ConditionalOnProperty("createWebSocket").

Notez que Spring Boot propose un certain nombre de conditions utiles préemballées.

39

Pour Spring Boot 2+, vous pouvez simplement utiliser:

@Profile("prod")
or
@Profile({"prod","stg"})

Cela vous permettra de filtrer le ou les profils souhaités, pour la production ou le transfert et pour le bean sous-jacent en utilisant cette annotation, il ne sera chargé par Springboot que lorsque vous définissez la variable spring.profiles.active est égal à "prod" et ("" prod "ou" stg "). Cette variable peut être définie sur O.S. variables d'environnement ou à l'aide de la ligne de commande, telles que -Dspring.profiles.active = prod.

0
rod.poli.diniz

Quant à moi, ce problème peut être résolu en utilisant Spring 3.1 @Profiles, car @Conditional l'annotation vous donne la possibilité de définir une stratégie d'enregistrement conditionnel du bean (stratégies définies par l'utilisateur pour la vérification conditionnelle), lorsque @Profiles la logique ne peut être basée que sur les variables Environment.

0
Dmytro Melnychuk