从数据库加载spring boot app属性

【从数据库加载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方法,以避免为每个会话创建它。

    推荐阅读