背景:
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と比べると、スマートしコードもすっきりになりました。