Quelqu'un pourrait-il indiquer à un MWE comment utiliser l'annotation @ConfigurationProperties
directement sur une méthode @Bean
?
J'ai vu d'innombrables exemples d'utilisation des définitions de classe, mais pas encore pour les méthodes @Bean
.
Pour citer la documentation :
@Bean
Donc, je pense qu'il y a une possibilité et une utilisation envisagée également - mais malheureusement, je suis incapable de le comprendre.
spring.datasource.url = [url]
spring.datasource.username = [username]
spring.datasource.password = [password]
spring.datasource.driverClassName = Oracle.jdbc.OracleDriver
@Bean
@ConfigurationProperties(prefix="spring.datasource")
public DataSource dataSource() {
return new DataSource();
}
Ici, la classe DataSource a l'adresse URL, le nom d'utilisateur, le mot de passe, le nom driverClassName, de sorte que Spring Boot les mappe sur l'objet créé.
Exemple de la classe DataSource:
public class DataSource {
private String url;
private String driverClassName;
private String username;
private String password;
//getters & setters, etc.
}
En d'autres termes, cela a le même effet que si vous initialisiez un bean avec des annotations de stéréotypes (@Component, @Service, etc.)
@Component
@ConfigurationProperties(prefix="spring.datasource")
public class DataSource {
private String url;
private String driverClassName;
private String username;
private String password;
//getters & setters, etc.
}
En plus d'utiliser @ConfigurationProperties
pour annoter une classe, vous pouvez également l'utiliser sur les méthodes publiques @Bean
. Cela peut être particulièrement utile lorsque vous souhaitez lier des propriétés à des composants tiers en dehors de votre contrôle.
Pour configurer un bean à partir des propriétés de l'environnement, ajoutez @ConfigurationProperties
à son enregistrement, comme indiqué dans l'exemple suivant:
@ConfigurationProperties(prefix = "another")
@Bean
public AnotherComponent anotherComponent() {
...
}
Toute propriété définie avec un autre préfixe est mappée sur ce bean AnotherComponent de manière similaire à l'exemple précédent AcmeProperties.
Vous pouvez utiliser @ConfigurationProperties comme ci-dessous
Modèle d'entité
public class MY_ENTITY {
private String prop1;
private String prop2;
// setter & getter & toString()
}
Méthode de haricot
@Configuration
public class MyClass {
@Bean
@ConfigurationProperties(prefix = "my.entity")
public MY_ENTITY getContract() {
return new MY_ENTITY()
.setProp1("prop1111111")
.setProp2("prop2222222")
;
}
@Bean(name = "contract2")
@ConfigurationProperties(prefix = "my.entity2")
public MY_ENTITY getContract2() {
return new MY_ENTITY()
.setProp1("prop1111.2222")
.setProp2("prop2222.222")
;
}
}
application.properties
my.entity.prop1=2120180023
my.entity.prop2=CUSTOMER_NAME111
my.entity2.prop1=9994494949
my.entity2.prop2=CUSTOMER_NAME222
SpringBootApplication
@SpringBootApplication
public class DemoApplication implements CommandLineRunner {
@Autowired
@Qualifier("contract2")
private MY_ENTITY myEntity;
public static void main(String[] args) throws Exception {
SpringApplication.run(DemoApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
System.out.println(myEntity);
}
}