es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , , ,

Answer

  1. Avatar for 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.

Comments are closed.