我有从外部配置web服务获取的jdbc属性文件 在spring boot中为了设置mysql道具,将它们添加到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
我怎样才能在我的应用程序中重写那些程序?
同样适用于Spring-batch道具:
database.driver=com.mysql.jdbc.Driver
database.url=jdbc:mysql://localhost/mydv
database.username=root
database.password=root
答案 0 :(得分:42)
您可以在生命周期监听器中添加其他属性源,以响应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
这对我有用,但是,你现在可以做的事情有点受限,因为它在应用程序启动阶段相当早,你必须找到一种方法来获取你需要的价值而不依赖其他春豆等。
答案 1 :(得分:24)
只是为这个帖子提供另一个选项供我参考,因为当我开始寻找我的要求的答案时,这在搜索列表中很高,但没有涵盖我的用例。
我希望在启动时以编程方式设置spring boot属性,但不需要使用spring支持的不同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);
}
}
答案 2 :(得分:15)
由于春季启动1.3 EnvironmentPostProcessor可用于此目的。创建它的子类并在META-INF / spring.factories中注册这里有一个很好的例子:
答案 3 :(得分:2)
从Spring Boot 2.0.X开始,您可以结合使用自定义ApplicationContextInitializer和ContextConfiguration批注来动态覆盖单个属性(例如,在单元测试中)。
[
答案 4 :(得分:1)
在配置中使用此方法,您可以设置默认属性。
ggplot(mtcars) +
aes(x = cyl, y = mpg, fill = mpg < 34) +
geom_bar(stat = "identity")
答案 5 :(得分:1)
如果您正在运行Spring Boot应用程序,这是在启动过程中设置属性的方式。
最简单的方法是在启动应用之前设置属性。
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(Application.class);
ConfigurableEnvironment env = new ConfigurableEnvironment();
env.setActiveProfiles("whatever");
Properties properties = new Properties();
properties.put("server.port", 9999);
env.getPropertySources()
.addFirst(new PropertiesPropertySource("initProps", properties));
application.setEnvironment(env);
application.run(args);
}
}
答案 6 :(得分:1)
如果出于测试目的需要执行此操作:从春季测试5.2.5开始,您可以使用@DynamicPropertySource
:
@DynamicPropertySource
static void setDynamicProperties(DynamicPropertyRegistry registry) {
registry.add("some.property", () -> some.way().of(supplying).a(value) );
}
优先于几乎所有其他提供属性的方式。但是,该方法必须是静态的。
答案 7 :(得分:0)
在META-INF文件夹下,准确创建此文件夹和文件: 弹簧&GT;批次&GT;倍率&GT;数据源的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" />
答案 8 :(得分:0)
如果必须,可以通过编程方式覆盖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);
}
答案 9 :(得分:0)
这可能非常简单:
@SpringBootApplication
public class SampleApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(SampleApplication.class)
.properties(props())
.build()
.run(args);
}
private static Properties props() {
Properties properties = new Properties();
properties.setProperty("MY_VAR", "IT WORKS");
return properties;
}
}
application.yml
test:
prop: ${MY_VAR:default_value}