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?
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.
Annotez votre méthode de bean avec @ConditionalOnProperty("createWebSocket")
.
Notez que Spring Boot propose un certain nombre de conditions utiles préemballées.
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.
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
.