Home > other >  How to use values from application.properties in named properties of annotations on class header
How to use values from application.properties in named properties of annotations on class header

Time:10-02

It is known that some annotations have named properties, such as:

@MyAnnotation(name="myName", url="http://www.example.com")

Now, if I were to use this annotation in MyClass like this:

@MyAnnotation(name="myName", url="http://www.example.com")
public class MyClass {
   ...
}

but move the values "myName" and "http://www.example.com" into application.properties like this:

services.name=myName
services.url=http://www.example.com

then how can I access these properties from MyClass?

I was able to use the properties defined in application.properties as below:

@PropertySource("classpath:application.properties")
@MyAnnotation(name="${services.name}", url="${services.url}")
public class MyClass {
   ...
}

However, I am not sure if others can use application.properties values like this as well.

CodePudding user response:

You can achieve binding using @ConfigurationProperties annotation.

@Configuration
@ConfigurationProperties(prefix = "services")
public class MyClass {
   private String name;
   private String url;
}

We use @Configuration so that Spring creates a Spring bean in the application context.

@ConfigurationProperties works best with hierarchical properties that all have the same prefix; therefore, we add a prefix of mail.

The Spring framework uses standard Java bean setters, so we must declare setters for each of the properties.

Note: If we don't use @Configuration in the POJO, then we need to add @EnableConfigurationProperties(ConfigProperties.class) in the main Spring application class to bind the properties into the POJO:

@SpringBootApplication
@EnableConfigurationProperties(MyClass.class)
public class EnableConfigurationDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(EnableConfigurationDemoApplication.class, args);
    }
}

Spring will automatically bind any property defined in our property file that has the prefix services and the same name as one of the fields in the ConfigProperties class.

References :

https://www.baeldung.com/configuration-properties-in-spring-boot

CodePudding user response:

You can simply use @Value annotation. For that your class must managed by Spring. In other words your class must be a Spring Bean.

Something like this,

@Service
public class MyClass {
   @Value("${services.name}")
   private String name;

   @Value("${services.url}")
   private String url;
}

Note: For more info here

You can also create custom configuration property class. Something like this,

@Configuration
@ConfigurationProperties("services")
public class MyClass {
   private String name;
   private String url;
}

Note: For more info here

  • Related