From spring boot documentation, @ConfigurationProperties
will
generate your own configuration metadata file from items annotated with @ConfigurationProperties
I tried use @Configuration
and @ConfigurationProperties
separately on my configuration class.
@Component
//@Configuration
@ConfigurationProperties
@EnableSpringDataWebSupport
@EnableAsync
public class AppConfig {
...
}
I didn't see any noticable difference.
What's the usage of @ConfigurationProperties
or @Configuration
?
@Configuration
is used to create a class the creates new beans (by annotating its methods with @Bean
):
@Configuration
public class CustomConfiguration {
@Bean
public SomeClass someClass() {
return new SomeClass();
}
}
@ConfigurationProperties
binds external configuration into the fields of the class which it annotates. It's common to use it with a @Bean
method to create a new bean that encapsulates configuration which can be controlled externally.
Here's a real world example of how we've used it. Consider a simple POJO that holds some values related to connecting to ZooKeeper:
public class ZookeeperProperties
{
private String connectUrl;
private int sessionTimeoutMillis = (int) TimeUnit.SECONDS.toMillis(5);
private int connectTimeoutMillis = (int) TimeUnit.SECONDS.toMillis(15);
private int retryMillis = (int) TimeUnit.SECONDS.toMillis(5);
private int maxRetries = Integer.MAX_VALUE;
// getters and setters for the private fields
}
Now we can create a bean of type ZookeeperProperties
and automatically populate it using external configuration:
@Configuration
public class ZooKeeperConfiguration {
@ConfigurationProperties(prefix = "zookeeper")
@Bean
public ZookeeperProperties zookeeperProperties() {
// Now the object we create below will have its fields populated
// with any external config that starts with "zookeeper" and
// whose suffix matches a field name in the class.
//
// For example, we can set zookeeper.retryMillis=10000 in our
// config files, environment, etc. to set the corresponding field
return new ZookeeperProperties();
}
}
The benefit of this is that it's less verbose than adding @Value
to every field of ZookeeperProperties
. Instead, you provide a single annotation on the @Bean
method and Spring automatically binds any external configuration it finds with the matching prefix to the fields of that class.
It also lets different users of my class (i.e. anyone who creates a bean type of ZookeeperProperties
) use their own prefix to configure the class.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With