Consider the following example:

    @Value Example

    @Value Example

    1. import javax.inject.Singleton
    2. @Singleton
    3. class EngineImpl implements Engine {
    4. @Value('${my.engine.cylinders:6}') (1)
    5. protected int cylinders
    6. @Override
    7. int getCylinders() {
    8. this.cylinders
    9. }
    10. String start() { (2)
    11. "Starting V${cylinders} Engine"
    12. }
    13. }

    @Value Example

    1. import javax.inject.Singleton
    2. @Singleton
    3. class EngineImpl : Engine {
    4. @Value("\${my.engine.cylinders:6}") (1)
    5. override var cylinders: Int = 0
    6. protected set
    7. override fun start(): String {(2)
    8. return "Starting V$cylinders Engine"
    9. }
    10. }

    Note that @Value can also be used to inject a static value, for example the following will inject the number 10:

    Static @Value Example

    1. @Value("10")
    2. int number;

    However it is definitely more useful when used to compose injected values combining static content and placeholders. For example to setup a URL:

    Placeholders with @Value

    In the above example the URL is constructed from 2 placeholder properties that must be present in configuration: my.host and my.port.

    Placeholders with @Value

    1. @Value("${my.url:`http://foo.com`}")
    2. URL url;

    Note that there is nothing special about @Value itself regarding the resolution of property value placeholders.

    Due to Micronaut’s extensive support for annotation metadata you can in fact use property placeholder expressions on any annotation. For example, to make the path of a @Controller configurable you can do:

    1. ...
    2. }

    In the above case if hello.controller.path is specified in configuration then the controller will be mapped to the path specified otherwise it will be mapped to /hello.

    You can also make the target server for configurable (although service discovery approaches are often better), for example:

    1. @Client("${my.server.url:`http://localhost:8080`}")
    2. interface HelloClient {
    3. ...
    4. }

    In the above example the property my.server.url can be used to configure the client otherwise the client will fallback to a localhost address.

    Using the @Property Annotation

    Recall that the annotation receives a String value which is a mix of static content and placeholder expressions. This can lead to confusion if you attempt to do the following:

    Incorrect usage of @Value

    In the above case the value my.url will be injected and set to the url field and not the value of the my.url property from your application configuration, this is because @Value only resolves placeholders within the value specified to it.

    Using @Property

    1. import io.micronaut.context.annotation.Property;
    2. import javax.inject.Inject;
    3. import javax.inject.Singleton;
    4. @Singleton
    5. public class Engine {
    6. @Property(name = "my.engine.cylinders") (1)
    7. protected int cylinders; (2)
    8. private String manufacturer;
    9. public int getCylinders() {
    10. return cylinders;
    11. }
    12. public String getManufacturer() {
    13. return manufacturer;
    14. }
    15. @Inject
    16. public void setManufacturer(@Property(name = "my.engine.manufacturer") String manufacturer) { (3)
    17. this.manufacturer = manufacturer;
    18. }
    19. }

    Using @Property

    1. import io.micronaut.context.annotation.Property
    2. @Singleton
    3. class Engine {
    4. @Property(name = "my.engine.cylinders") (1)
    5. protected int cylinders (2)
    6. @Property(name = "my.engine.manufacturer") (3)
    7. String manufacturer
    8. int getCylinders() {
    9. cylinders
    10. }
    11. }

    Using @Property

    1. import io.micronaut.context.annotation.Property
    2. import javax.inject.Inject
    3. import javax.inject.Singleton
    4. @Singleton
    5. class Engine {
    6. @field:Property(name = "my.engine.cylinders") (1)
    7. protected var cylinders: Int = 0 (2)
    8. @set:Inject
    9. @setparam:Property(name = "my.engine.manufacturer") (3)
    10. var manufacturer: String? = null
    11. fun cylinders(): Int {
    12. return cylinders
    13. }
    14. }

    The above will instead inject the value of the my.url property resolved from application configuration. If the property can not be found in configuration, an exception will be thrown. As with other types of injection, the injection point can also be annotated with @Nullable to make the injection optional.

    You can also use this feature to resolve sub maps. For example, consider the following configuration:

    Example application.yml configuration

    If you wish to resolve a flattened map containing only the properties starting with hibernate then you can do so with @Property, for example:

    Using @Property

    1. @Property(name = "jpa.default.properties")
    2. Map<String, String> jpaProperties;

    The injected map will contain the keys hibernate.hbm2ddl.auto and and their values.