【从数据库加载spring boot app属性】胸怀万里世界, 放眼无限未来。这篇文章主要讲述从数据库加载spring boot app属性相关的知识,希望能为你提供帮助。
我需要你就这个问题向我提出建议,在Spring启动应用程序中我从数据库加载一些属性,如(cron period,email data),我需要在应用程序上下文中导出这些属性,以便弹出构建相应的bean加载数据。我怎么能这样做?
答案对于那些在应用程序启动之前需要从数据库加载属性的人,并使@Value可以在项目的任何位置访问这些道具,只需添加此处理器即可。
public class ReadDbPropertiesPostProcessor implements EnvironmentPostProcessor {
/**
* Name of the custom property source added by this post processor class
*/
private static final String PROPERTY_SOURCE_NAME = "databaseProperties";
private String[] KEYS = {
"excel.threads",
"cronDelay",
"cronDelayEmail",
"spring.mail.username",
"spring.mail.password",
"spring.mail.host",
"spring.mail.port",
"spring.mail.properties.mail.transport.protocol",
"spring.mail.properties.mail.smtp.auth",
"spring.mail.properties.mail.smtp.starttls.enabled",
"spring.mail.properties.mail.debug",
"spring.mail.properties.mail.smtp.starttls.required",
"spring.mail.properties.mail.socketFactory.port",
"spring.mail.properties.mail.socketFactory.class",
"spring.mail.properties.mail.socketFactory.fallback",
"white.executor.threads",
"white.search.threads",
"lot.sync.threads",
"lot.async.threads",
"lot.soap.threads",
"excel.async.threads",
"kpi.threads",
"upload.threads"
};
/**
* Adds Spring Environment custom logic. This custom logic fetch properties from database and setting highest precedence
*/
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {Map<
String, Object>
propertySource = new HashMap<
>
();
try {// Build manually datasource to ServiceConfig
DataSource ds = DataSourceBuilder
.create()
.username(environment.getProperty("spring.datasource.username"))
.password(environment.getProperty("spring.mail.password"))
.url(environment.getProperty("spring.datasource.url"))
.driverClassName("com.mysql.jdbc.Driver")
.build();
// Fetch all propertiesConnection connection = ds.getConnection();
JTrace.genLog(LogSeverity.informational, "cargando configuracion de la base de datos");
PreparedStatement preparedStatement = connection.prepareStatement("SELECT value FROM config WHERE id = ?");
for (int i = 0;
i <
KEYS.length;
i++) {String key = KEYS[i];
preparedStatement.setString(1, key);
ResultSet rs = preparedStatement.executeQuery();
// Populate all properties into the property source
while (rs.next()) {
propertySource.put(key, rs.getString("value"));
}rs.close();
preparedStatement.clearParameters();
}preparedStatement.close();
connection.close();
// Create a custom property source with the highest precedence and add it to Spring Environment
environment.getPropertySources().addFirst(new MapPropertySource(PROPERTY_SOURCE_NAME, propertySource));
} catch (Throwable e) {
throw new RuntimeException(e);
}
}
在application.properties中必须存在数据源数据才能连接到数据库。
然后在文件夹META-INF中创建一个名为spring.factories的文件,其中包含以下行:
org.springframework.boot.env.EnvironmentPostProcessor=test.config.ReadDbPropertiesPostProcessor
就是这样,可以在任何地方访问转换后的属性。
另一答案您可以根据需要手动配置bean以及数据库值(这样您就可以利用Spring CDI和引导数据库配置)。
以设置会话超时为例:
@SpringBootApplication
public class MySpringBootApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(MySpringBootApplication.class, args);
}@Bean
public HttpSessionListener httpSessionListener(){
return new MyHttpSessionListener();
}
}
然后是用于配置bean的bean定义:
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MyHttpSessionListener implements HttpSessionListener {
@Autowired
private MyRepository myRepository;
@Override
public void sessionCreated(HttpSessionEvent se) {
se.getSession().setMaxInactiveInterval(this.myRepository.getSessionTimeoutSeconds());
}@Override
public void sessionDestroyed(HttpSessionEvent se) {
// Noop
}}
注意:您可以将数据库调用移动到
@PostConstruct
方法,以避免为每个会话创建它。推荐阅读
- Firebase FCM - 为什么我得到(有效载荷错误,无效的'android'(或'apns')属性)
- 通过WordPress网站将通知推送到Android应用程序
- Android(OneSignal如何使用自定义图标或应用图标更改通知帐单图标())
- 重复通知GCM android应用程序
- xcode 8.0“将Push Notif(..)添加到您的App ID”警告,同时已添加
- 如何解决Composer安装/更新错误(PackageVersions\Installer::activate()的返回值必须是PackageVersions\void的实例,不返回任何值)
- PHP或WordPress(哪个对你的业务更好,为什么())
- 保护黑客网站安全的6种方法
- UI/UX决定了你的mCommerce(移动商务)应用程序的未来-是真的吗()