LoginSignup
0
0

More than 3 years have passed since last update.

SpringBoot のapplication.propertiesで設定したdatasourceの一部を実行時に変更する方法

Posted at

背景:
 application.propertiesで以下のdatasourceを設定していますが、


     spring.datasource.driver-class-name=org.postgresql.Driver
     spring.datasource.url=jdbc:postgresql://localhost:5432/spring-sample
     spring.datasource.username=test
     spring.datasource.password=test

SpringBoot起動時に、spring.datasource.urlを動的にApplicationNameを設定したいです。

解決方法は二つあります。

方法1. @Configuration を使用する

DataSourceConfig.java
import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DataSourceConfig {

    @Value("${spring.datasource.url}")
    private String url;

    @Value("${spring.datasource.username}")
    private String username;

    @Value("${spring.datasource.password}")
    private String password;

    @Bean 
    public DataSource getDataSource() { 
        DataSourceBuilder<?> dataSourceBuilder = DataSourceBuilder.create(); 
            // url にApplicationNameを追加する
        dataSourceBuilder.url(url + "?ApplicationName=MyApp");
        dataSourceBuilder.username(username); 
        dataSourceBuilder.password(password); 
        return dataSourceBuilder.build(); 
    }
}

御覧の通り、この方法では、変更不要のusernameとpasswordも設定する必要です。
今度、application.propertiesにdatasorceの設定を追加するたびに、
このクラスも併せて修正しないといけません。

方法2.BeanPostProcessor インタフェースを実装する

DataSourcePropertiesPostProcessor.java
import org.springframework.beans.factory.config.BeanPostProcessor;

@Component
public class DataSourcePropertiesPostProcessor implements BeanPostProcessor  {  
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof DataSourceProperties) {
            DataSourceProperties properties = (DataSourceProperties) bean;
            String url = properties.getUrl();
            properties.setUrl( url + "?ApplicationName=MyApp");
        }
        return bean;
    }
}

方法1と比べると、スマートしコードもすっきりになりました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0