我正在将现有的Java应用程序转换为Spring Boot。
我是一个Spring Boot新手。我知道Spring Boot支持application.properties
,这对新应用程序非常有用。但这是一个遗留应用程序,我现在需要一个临时解决方案 - 没有完全重新设计它。这个应用程序需要在启动时使用属性文件调用一些初始化程序。有prod.properties
和另一个用于测试 - test.properties
。
需要从磁盘上的特定位置(/mydir/prod.properties)加载prod文件,而test.properties
来自测试的类路径。
另外,遗留类可能需要在它们的创建时初始化这个“属性类”(它们在静态初始化器中引用它,哦geez ...) - 所以这个init需要在Spring组件加载之前发生。
最简单的解决方案是什么? 我想出了这种过于冗长的锅炉板解决方案。它有效,但也许有一种更简单的方法?
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import javax.inject.Inject;
@SpringBootApplication
public class DemoApplication implements CommandLineRunner {
@Inject
private Initializer initializer;
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
initializer.init();
}
}
public interface Initializer {
void init();
}
@Component
public class ProdInitializer implements Initializer {
@Override
public void init() {
System.out.println("PROD init - will load properties file from /myfolder/ and call some init class with it");
}
}
// and this is from TESTS section:
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
@Primary
@Component
public class TestInitializer implements Initializer {
@Override
public void init() {
System.out.println("TEST init - will load properties file from classpath and call some init class with it");
}
}
我尝试只使用一个初始化程序,其中只有一个test/resources/application.properties
文件,其中只有一个值(遗留属性文件位置),希望Spring Boot从PROD代码加载application.properties
,然后加载唯一的值出现在test/resources/application.properties
中并覆盖main/resources/application.properties
中的相应值,但没有运气 - 显然,如果存在main/resources/application.properties
,Spring Boot会忽略test/resources/application.properties
的测试。所以我必须复制main/resources/application.properties
中test/resources/application.properties
的所有设置,只有一个属性不同。