As we all know, Spring provides multiple ways to achieve the same goal, one of which is how to retrieve the values registered in the configuration file.
If you are new to Spring, you may come across code that uses the @Value
annotation to retrieve values from a application.properties
or application.yml
file. If you use this approach, be aware that there is nothing wrong with it; however, you may introduce unnecessary complexity into your application.
@Value
QuestionThe main problem with using @Value
is when dealing with variables that contain other values. Does this make sense? not understand? Let’s look at an example:
Assume you have the following configuration file:
<code>mail.user=dev@locahost mail.password=123 mail.headers.x-from=Ekerdev mail.headers.x-custom=custom</code>
You need to do it like this:
<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>
So far, no problems. But now imagine that your application needs to use these same variables in multiple places in your code. Think about how much duplicate code we would get, right?
So the best solution is to use the @ConfigurationProperties
annotation. This makes it easier for our application to inject variables into classes and we can use it like any other dependency in Spring, as shown in the example below:
Spring 3.x solution one:
<code class="language-java">@Configuration @ConfigurationProperties("mail") public record MailProperties( String user, String password, Map<String, String> headers ) {}</code>
Spring 3.x solution two:
<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>
Spring 2.x solution one:
<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>
Your service usage attributes are as follows:
<code class="language-java">@Service @RequiredArgsConstructor public class CustomService { private final MailProperties mailProperties; }</code>
The main advantage of using @ConfigurationProperties
is that we don’t have to look for the @Value
annotation in the code, which makes the code easier to read.
The above is the detailed content of Reading configuration like a pro on Spring. For more information, please follow other related articles on the PHP Chinese website!