Comme nous le savons tous, Spring propose plusieurs façons d'atteindre le même objectif, dont l'une consiste à récupérer les valeurs enregistrées dans le fichier de configuration.
Si vous êtes nouveau sur Spring, vous rencontrerez peut-être du code qui utilise l'annotation @Value
pour récupérer les valeurs d'un fichier application.properties
ou application.yml
. Si vous utilisez cette approche, sachez qu'il n'y a rien de mal à cela, mais vous risquez d'introduire une complexité inutile dans votre application.
@Value
QuestionLe principal problème lié à l'utilisation de @Value
est lorsqu'il s'agit de variables contenant d'autres valeurs. Est-ce que cela a du sens ? pas compris ? Regardons un exemple :
Supposons que vous disposez du fichier de configuration suivant :
<code>mail.user=dev@locahost mail.password=123 mail.headers.x-from=Ekerdev mail.headers.x-custom=custom</code>
Vous devez procéder comme ceci :
<code class="language-java">@Service public class CustomService { @Value("${mail.user}") private String user; @Value("${mail.password}") private String password; @Value("${mail.headers.x-from}") private String xFrom; @Value("${mail.headers.x-custom}") private String xCustom; }</code>
Jusqu'à présent, aucun problème. Mais imaginez maintenant que votre application doive utiliser ces mêmes variables à plusieurs endroits de votre code. Pensez à la quantité de code en double que nous obtiendrons, n'est-ce pas ?
La meilleure solution est donc d'utiliser l'annotation @ConfigurationProperties
. Cela permet à notre application d'injecter plus facilement des variables dans les classes et nous pouvons l'utiliser comme n'importe quelle autre dépendance dans Spring, comme le montre l'exemple ci-dessous :
Solution 1 de Spring 3.x :
<code class="language-java">@Configuration @ConfigurationProperties("mail") public record MailProperties( String user, String password, Map<String, String> headers ) {}</code>
Solution Spring 3.x deux :
<code class="language-java">@Configuration @ConfigurationProperties("mail.headers") public record MailHeadersProperties( String xFrom, String xCustom ) {} @Configuration @ConfigurationProperties("mail") public record MailProperties( String user, String password, MailHeadersProperties headers ) {}</code>
Solution 1 de Spring 2.x :
<code class="language-java">@Data @AllArgsConstructor @ConfigurationPropertiesScan @ConfigurationProperties("mail") public class MailProperties { private String user; private String password; private Map<String, String> headers; }</code>
<code class="language-java">@SpringBootApplication @ConfigurationPropertiesScan("your.package.mailproperties") //your.package.mailproperties 替换成你的包路径 public class ExampleApplication { public static void main(String[] args) { SpringApplication.run(ExampleApplication.class, args); } }</code>
Vos attributs d'utilisation du service sont les suivants :
<code class="language-java">@Service @RequiredArgsConstructor public class CustomService { private final MailProperties mailProperties; }</code>
Le principal avantage de l'utilisation de @ConfigurationProperties
est que nous n'avons pas besoin de chercher l'annotation @Value
dans le code, ce qui rend le code plus facile à lire.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!