Inyectar automáticamente un objeto personalizado de @ConfigurationProperties en Primavera utilizando un prefijo.
Me gustaría lograr una implementación no trivial de inyección de beans.
Tengo un archivo de propiedades personalizado:
@Getter
@Setter
@ConfigurationProperties
public class DatabaseProperties {
private String url;
private String username;
private String password;
}
Aquí está el archivo de configuración:
@Configuration
@EnableConfigurationProperties(DatabaseProperties.class)
public class DBConfig {
@Bean
@ConfigurationProperties(prefix = "datasource.database1")
public JdbcTemplate jdbcTemplateDatabase1(DatabaseProperties databaseProperties) {
DataSource dataSource = new DriverManagerDataSource(
databaseProperties.getUrl(),
databaseProperties.getUsername(),
databaseProperties.getPassword());
return new JdbcTemplate(dataSource);
}
@Bean
@ConfigurationProperties(prefix = "datasource.database2")
public JdbcTemplate jdbcTemplateDatabase2(DatabaseProperties databaseProperties) {
DataSource dataSource = new DriverManagerDataSource(
databaseProperties.getUrl(),
databaseProperties.getUsername(),
databaseProperties.getPassword());
return new JdbcTemplate(dataSource);
}
}
El objetivo que deseo lograr es instanciar una nueva instancia de DatabaseProperties basada en el prefijo.
Hay dos soluciones posibles:
- crear dos beans de tipo DatabaseProperties utilizando los prefijos correspondientes y dos beans de JdbcTemplate donde el parámetro sea un bean de DatabaseProperties calificado correctamente.
- en cada bean de JdbcTemplate, proporcionar 3 parámetros (String url, String username, String password) e inyectarlos a través de @Value.
PERO ¿Es posible evitar la creación de beans de DatabaseProperties para cada JdbcTemplate o el uso de @Value?
davy.ai
Sí, es posible deshacerse de la creación de beans DatabaseProperties para cada JdbcTemplate o de usar @Value utilizando la anotación @Qualifier en el archivo DBConfig. En lugar de inyectar todo el bean DatabaseProperties en cada bean JdbcTemplate, podemos inyectar solo las propiedades requeridas utilizando la anotación @Value, junto con la anotación @Qualifier para especificar qué propiedad inyectar para cada bean JdbcTemplate.
Aquí tienes un ejemplo:
@Configuration
@EnableConfigurationProperties(DatabaseProperties.class)
public class DBConfig {
@Bean
@Qualifier(“db1Properties”)
@ConfigurationProperties(prefix = “datasource.database1”)
public DatabaseProperties db1Properties() {
return new DatabaseProperties();
}
@Bean
@Qualifier(“db2Properties”)
@ConfigurationProperties(prefix = “datasource.database2”)
public DatabaseProperties db2Properties() {
return new DatabaseProperties();
}
@Bean
public JdbcTemplate jdbcTemplateDatabase1(@Qualifier(“db1Properties”) DatabaseProperties databaseProperties) {
DataSource dataSource = new DriverManagerDataSource(
databaseProperties.getUrl(),
databaseProperties.getUsername(),
databaseProperties.getPassword());
return new JdbcTemplate(dataSource);
}
@Bean
public JdbcTemplate jdbcTemplateDatabase2(@Qualifier(“db2Properties”) DatabaseProperties databaseProperties) {
DataSource dataSource = new DriverManagerDataSource(
databaseProperties.getUrl(),
databaseProperties.getUsername(),
databaseProperties.getPassword());
return new JdbcTemplate(dataSource);
}
}
En este ejemplo, creamos dos beans DatabaseProperties: db1Properties y db2Properties, cada uno con su propio prefijo. Luego, utilizamos la anotación @Qualifier para inyectar las propiedades correctas en cada bean JdbcTemplate. De esta forma, no necesitamos inyectar todo el bean DatabaseProperties o usar @Value para cada propiedad, lo que hace que la implementación de la inyección de beans sea menos trivial.