私は外部設定Webサービスから取得したjdbcプロパティファイルを持っていますmybootプロパティを設定するために春のブートでapplication.propertiesに追加するのは簡単です:
spring.datasource.url=jdbc:mysql://localhost/mydb
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
アプリでそれらをプログラムでオーバーライドするにはどうすればよいですか?
同じことが春バッチ小道具にも当てはまります。
database.driver=com.mysql.jdbc.Driver
database.url=jdbc:mysql://localhost/mydv
database.username=root
database.password=root
ApplicationEnvironmentPreparedイベントに反応するライフサイクルリスナーに追加のプロパティソースを追加できます。
以下のラインに沿ったもの:
public class DatabasePropertiesListener implements ApplicationListener<ApplicationEnvironmentPreparedEvent> {
public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
ConfigurableEnvironment environment = event.getEnvironment();
Properties props = new Properties();
props.put("spring.datasource.url", "<my value>");
environment.getPropertySources().addFirst(new PropertiesPropertySource("myProps", props));
}
}
次に、クラスをsrc/main/resources/META-INF/spring.factoriesに登録します。
org.springframework.context.ApplicationListener=my.package.DatabasePropertiesListener
これは私にとってはうまくいきましたが、アプリケーションの起動段階のかなり早い段階で、この時点で何ができるかについてはある程度制限されています。他の春に頼らずに必要な値を取得する方法を見つける必要があります豆など.
参照用にこのスレッドに別のオプションを提供するために、要件の答えを探し始めたとき、これは検索リストで高くなりましたが、私のユースケースをカバーしていませんでした。
起動時にプログラムでスプリングブートプロパティを設定しようとしていましたが、スプリングがサポートするさまざまなXML/Configファイルを操作する必要はありませんでした。
最も簡単な方法は、SpringApplicationの定義時にプロパティを設定することです。以下の基本的な例では、Tomcatポートを9999に設定します。
@SpringBootApplication
public class Demo40Application{
public static void main(String[] args){
SpringApplication application = new SpringApplication(Demo40Application.class);
Properties properties = new Properties();
properties.put("server.port", 9999);
application.setDefaultProperties(properties);
application.run(args);
}
}
Spring Boot 1.3以降では、この目的で EnvironmentPostProcessor を使用できます。そのサブクラスを作成し、META-INF/spring.factoriesに登録します。良い例は次のとおりです。
Spring Boot 2.0.Xでは、カスタムApplicationContextInitializerとContextConfigurationアノテーションの組み合わせを使用して、個々のプロパティを動的にオーバーライドできます(ユニットテストなど)。
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.PortTest.RandomPortInitailizer;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.context.support.TestPropertySourceUtils;
import org.springframework.util.SocketUtils;
import static org.assertj.core.api.Assertions.assertThat;
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(initializers = RandomPortInitializer.class)
public class PortTest {
@Autowired
private SomeService service;
@Test
public void testName() throws Exception {
System.out.println(this.service);
assertThat(this.service.toString()).containsOnlyDigits();
}
@Configuration
static class MyConfig {
@Bean
public SomeService someService(@Value("${my.random.port}") int port) {
return new SomeService(port);
}
}
static class SomeService {
private final int port;
public SomeService(int port) {
this.port = port;
}
@Override
public String toString() {
return String.valueOf(this.port);
}
}
public static class RandomPortInitializer
implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
int randomPort = SocketUtils.findAvailableTcpPort();
TestPropertySourceUtils.addInlinedPropertiesToEnvironment(applicationContext,
"my.random.port=" + randomPort);
}
}
}
構成でこのメソッドを使用すると、デフォルトのプロパティを設定できます。
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class)
.properties("propertyKey=propertyValue");
}
これは、必要に応じてプログラムでapplication.propertiesをオーバーライドする方法です。
public static void main(String[] args) {
SpringApplication app = new SpringApplication(Restdemo1Application.class);
app.setAdditionalProfiles("dev");
// overrides "application.properties" with "application-dev.properties"
app.run(args);
}
META-INFフォルダーの下に次のフォルダーとファイルを正確に作成します:spring> batch> override> data-source-context.xmlそして、xmlファイルで、このように必要なパラメーターをオーバーライドしてください。
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${loader.jdbc.driver}" />
<property name="url" value="${loader.jdbc.url}" />
<property name="username" value="${loader.jdbc.username}" />
<property name="password" value="${loader.jdbc.password}" />
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
または、xmlファイルでこのようなjndiを使用して、catalina.propertiesなどの外部構成ファイルにアクセスします
<jee:jndi-lookup id="dataSource"
jndi-name="Java:comp/env/jdbc/loader-batch-dataSource" lookup-on-startup="true"
resource-ref="true" cache="true" />