Is it possible to create prototype beans using some pattern in @Value annotation with properties / yaml configuration?
There is an example what I mean:
Example object:
@Component @Scope("prototype") public class SomeObject { @Value("${someobject.key.name}") String name; @Value("${someobject.key.address}") String address; @Value("${someobject.key.phone}") int phone; getters and setters }
Example properties:
someobject.first.name = Phil someobject.first.address = Berlin someobject.first.phone = 123 someobject.second.name = Bill someobject.second.address = New-York someobject.second.phone = 321
I need to create two prototype beans
first with key “first”
second with key “second”
Ideal – if they will initialized like singletons on startup application
Advertisement
Answer
Yes you want to use Configuration Properties to allow binding of custom properties to a POJO.
package com.darrenforsythe.configurationpropertiesexample; import java.util.HashMap; import java.util.Map; import org.springframework.boot.context.properties.ConfigurationProperties; @ConfigurationProperties(prefix = "properties") public class MyProperties { private Map<String, Person> someobject = new HashMap<>(); public static class Person { /** Name of the Person */ private String name; /** Address of the Person */ private String address; /** Phone Number of the Person */ private String phone; String getName() { return name; } void setName(String name) { this.name = name; } String getAddress() { return address; } void setAddress(String address) { this.address = address; } String getPhone() { return phone; } void setPhone(String phone) { this.phone = phone; } @Override public String toString() { return "Person{" + "name='" + name + ''' + ", address='" + address + ''' + ", phone='" + phone + ''' + '}'; } } Map<String, Person> getSomeobject() { return someobject; } void setSomeobject(Map<String, Person> someobject) { this.someobject = someobject; } @Override public String toString() { return "MyProperties{" + "someobject=" + someobject + '}'; } }
And enable add @EnableConfigurationProperties(MyProperties.class)
to your main application or a @Configuration
class.
AFter this you can inject the MyProperties
to any Spring bean and use it as any other java object.
For example,
@Bean ApplicationRunner printProperties(MyProperties myProperties) { return args -> myProperties .getSomeobject() .forEach((key, person) -> System.out.println(key + " - " + person)); }
Will print each of the items.
Working example can be found here,
https://github.com/DarrenForsythe/configuration-properties-example