web-dev-qa-db-fra.com

Quelle est la différence entre les propriétés @EnableConfigurationproperties si un bean est déjà annoté avec @ConfigurationProperties?

La documentation de Spring Boot indique que pour utiliser l'annotation @ConfigurationProperties

Vous devez également répertorier les classes de propriétés à enregistrer dans l'annotation @EnableConfigurationProperties, comme indiqué dans l'exemple suivant:

et donne ce code:

@Configuration
@EnableConfigurationProperties(AcmeProperties.class)
public class MyConfiguration {
}

Mais dans le paragraphe suivant:

Même si la configuration précédente crée un bean normal pour AcmeProperties, nous recommandons que @ConfigurationProperties ne traite que l'environnement et n'injecte pas d'autres beans du contexte. Cela dit, l'annotation @EnableConfigurationProperties est également appliquée automatiquement à votre projet, de sorte que tout bean existant annoté avec @ConfigurationProperties soit configuré à partir de l'environnement.

Il n'est pas nécessaire de suggérer l'inscription d'un bean @ConfigurationProperties sous une annotation @EnableConfigurationProperties.

Alors c'est quoi? Expérimentalement, j’ai vu que si j’annote un bean avec @ConfigurationProperties, il reçoit les propriétés qui y sont injectées comme prévu sans avoir besoin de le lister dans @EnableConfigurationProperties, mais si c’est le cas, pourquoi lister tout ce qui a une annotation @ConfigurationProperties sous @EnableConfigurationProperties, comme indiqué dans la documentation? Cela fait-il une différence?

28
J Person

Comme M. Deinum l’a appelé @EnableConfigurationProperties permet de prendre en charge @ConfigurationProperties. Si vous regardez l'annotation Java Doc, vous pouvez voir:

Activer la prise en charge des beans annotés ConfigurationProperties. Les beans ConfigurationProperties peuvent être enregistrés de manière standard (par exemple, à l'aide des méthodes Bean @Bean) ou, pour plus de commodité, peuvent être spécifiés directement sur cette annotation. [...]

Par exemple, supposons que vous ayez une classe dont la responsabilité est de lire et de stocker les informations de votre application.yml/application.properties nécessaires pour établir une connexion avec différentes bases de données. Vous l'annotez avec @ConfigurationProperties.

Ensuite, vous avez généralement une classe annotée @Configuration qui fournit un DataSource@Bean à votre application. Vous pouvez utiliser le @EnableConfigurationProperties pour le lier à la classe @ConfigurationProperties et initialiser vos sources de données en conséquence.

Voici un petit exemple:

application.yml

data-sources:
  db1:
    url: "jdbc:postgresql://localhost:5432}/db1"
    username: test
    password: test
  db2:
    url: "jdbc:postgresql://localhost:5432}/db2"
    username: test
    password: test

DataSourcesConfiguration

@ConfigurationProperties
public class DataSourcesConfiguration {

    private Map<String, BasicDataSource> dataSources;

    public void setDataSources(Map<String, BasicDataSource> dataSources) {
        this.dataSources = dataSources;
    }

    Map<String, BasicDataSource > getDataSources() {
        return dataSources;
    }
}

DataSourceConnectionConfiguration

@Configuration
@EnableConfigurationProperties(DataSourcesConfiguration.class)
public class DatabaseConnectionConfiguration implements Provider<Connection> {

    private DataSourcesConfiguration dataSourcesConfiguration;

    public DatabaseConnectionConfiguration(DataSourcesConfiguration dataSourcesConfiguration) {
        this.dataSourcesConfiguration = dataSourcesConfiguration;
    }

    @Bean
    public DataSource dataSource() {
        // Use dataSourcesConfiguration to create application data source. E.g., a AbstractRoutingDataSource..
    }

}
28
Emanuel Miranda

Il m'a fallu un certain temps pour atteindre ce poste, mais j'aimerais ajouter ceci afin que d'autres puissent en bénéficier.

@ConfigurationProperties - Utilisé pour lier une classe avec un fichier de propriété externalisé. Très puissant, il doit être utilisé pour séparer les classes de beans avec la classe d'entité de configuration.

@Configuration - Crée un bean Spring de stéréotype de configuration.

@EnableConfigurationProperties - Crée une liaison entre une classe d'entité de configuration et le stéréotype de configuration Spring afin de pouvoir extraire facilement les propriétés après une injection dans un service.

12
alpha

Si nous regardons le code ci-dessous:

@Configuration @EnableConfigurationProperties @ConfigurationProperties(prefix="ar1") public class ar1Settings { }

  • @ Configuration indique à Spring de traiter cela comme une classe de configuration et de l'enregistrer comme un bean

  • @ EnableConfigurationProperties indique à Spring de traiter cette classe en tant que consommateur de valeurs application.yml/properties

  • @ ConfigurationProperties indique à Spring quelle section cette classe représente.

Si j'ai bien compris, si vous n'avez pas besoin de spécifier la section du fichier de propriétés, @ConfigurationProperties peut être omis.

7
AR1