Je travaille sur une application de démarrage de démarrage. Nous avons des fichiers de propriétés pour chaque environnement (dev, int, qa, prd etc). En ce qui concerne les haricots, certains doivent être créés différemment pour la production. Nous avons donc cette configuration:Spring/boot, profils, java config et ordre de création de haricot (Comportement inattendu ??)
@Configuration
class MyBeans {
@Bean(name="someBean")
@Profile("prd")
MyBean someBeanProd() {
...
}
@Bean(name="someBean")
MyBean someBeanDev() {
...
}
}
MyBean est autowired comme suit:
@Component
public class SomeService
{
@Autowired
private MyBean someBean;
}
Lors du démarrage de l'application avec:
-Dspring.profiles.active = prd
La méthode 'someBeanProd' est appelée (comme prévu) Le fichier rties est en cours de chargement (application-prd.properties). Pour tout autre profil, 'someBeanDev' est appelé (comme attendu) et le fichier de propriétés correspondant est chargé.
Cependant, si je change l'ordre des méthodes dans la configuration comme ci-dessous, la méthode 'someBeanDev' est appelée TOUJOURS (même si le profil actif est prd), mais le bon fichier de propriétés est utilisé.
@Configuration
class MyBeans {
@Bean(name="someBean")
MyBean someBeanDev() {
...
}
@Bean(name="someBean")
@Profile("prd")
MyBean someBeanProd() {
...
}
}
Est-ce le comportement correct/prévu? Je m'attendais à ce que le printemps crée le bon bean indépendamment de l'ordre des méthodes dans le fichier de configuration.
Existe-t-il un moyen de définir un bean pour un profil, et tout autre profil devrait revenir au profil 'par défaut'?
La création du bean prd dans une classe de configuration Java différente ne fonctionne pas non plus.
J'ai essayé l'approche avec @AutoConfigureAfter, et cela ne fonctionne toujours pas. – brnzn
Désolé, appuyez sur entrer trop tôt ... Merci pour votre réponse. J'ai essayé l'approche avec @AutoConfigureAfter, et cela ne fonctionne toujours pas. Fait intéressant, si la classe prd config est alphabétiquement après la classe dev config, alors spring utilise le bon bean (avec ou sans l'annotation AutoConfigureAfter). Par exemple: DevConfig, ProdConfig = fonctionne correctement DevConfig, Config = ne fonctionne pas Je n'ai pas essayé la première approche, car je ne veux pas créer de beans s'ils ne sont pas nécessaires. – brnzn
J'ai le même comportement que le vôtre, ce qui n'est pas simple IMO. Quoi qu'il en soit, j'ai édité ma réponse (deuxième approche) et celle-ci devrait fonctionner. –