一. 问题
spring 配置通常读取 .properties 文件;小项目 配置少;分布式项目 配置文件比较多;不容易运维维护;可以改为读取数据库,在数据库维护;
二. Spring 的已有解决方案
参考:https://www.codeproject.com/articles/28893/loading-application-properties-from-a-database
必须的jar包
-
spring.jar (Spring Core)
[PropertiesPlaceholderConfigurer]
-
spring-modules.jar (Spring Modules)
[CommonsConfigurationFactoryBean]
-
commons-configuration.jar (Commons Configuration)
[DatabaseConfiguration]
需要数据库里 有一个表:
For this example, the database has a schema in it called TEST_SCHEMA
and a table calledAPPLICATION_PROPERTIES_TABLE
with two columns KEY
and VALUE*
.
TEST_SCHEMA.APPLICATION_PROPERTIES_TABLE
Spring Configuration
<!-- Required to connect to datasource --> <bean name="PropertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="properties" ref="CommonsConfigurationFactoryBean"/> </bean> <bean name="CommonsConfigurationFactoryBean" class="org.springmodules.commons.configuration.CommonsConfigurationFactoryBean"> <constructor-arg ref="DatabaseConfiguration"/> </bean> <bean name="DatabaseConfiguration" class="org.apache.commons.configuration.DatabaseConfiguration"> <constructor-arg type="javax.sql.DataSource" ref="someDataSource"/> <constructor-arg index="1" value="TEST_SCHEMA.APPLICATION_PROPERTIES_TABLE"/> <constructor-arg index="2" value="KEY"/> <constructor-arg index="3" value="VALUE"/> </bean> <!-- Included to elaborate functionality --> <bean name="PropertiesPrinter " class="example.PropertiesPrinter" initMethod="displayAllProperties"> <property name="fileLocation" value="${file.location}"/> <property name="petDogsName" value="${pet.dogs.name}"/> <property name="keyOne" value="${key.one}"/> </bean> <!-- PropertiesPrinter 为测试 类 -->
三 .自己的方案:
以上方法是通过commons-configuration 来实现,这种每次读取和变动都会访问数据库,在我们的实际应用中,应该是启动的时候读取一次就可以了,没有必要占着数据库连接,而且全局配置不允许应用修改的。
spring 配置:
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="properties" ref="dataBaseProperties"/> </bean> <bean id="dataBaseProperties" class="com.test.common.utils.DatabaseProperties" > <constructor-arg type="javax.sql.DataSource" ref="confDataSource"/> <constructor-arg value="select key_p,value_p from tb_application_properties where type='common' or type='test' "/> </bean> <bean name="confDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://127.0.0.1:8066/test" /> <property name="username" value="test" /> <property name="password" value="test" /> </bean>
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Properties; import javax.sql.DataSource; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.InitializingBean; /** * DatabaseProperties * @version 1.0 2016年12月1日 * @since 1.0 */ public class DatabaseProperties implements InitializingBean, FactoryBean{ private static final Logger log = LoggerFactory.getLogger(DatabaseProperties.class); private static Properties props = new Properties(); private DataSource datasource; //数据源 private String query; //读取的sql public static final String SHIRO_USER_URL = "shiroUserUrl"; public static final String LOCAL_SERVICE = "localService"; public DatabaseProperties(DataSource datasource, String query) { this.datasource = datasource; this.query = query; } @Override public void afterPropertiesSet() throws Exception { initProperties(); } @Override public Object getObject() throws Exception { return props; } @Override public Class getObjectType() { return Properties.class; } @Override public boolean isSingleton() { return true; } private void initProperties() { Connection connection = null; try { connection = datasource.getConnection(); PreparedStatement ps = connection.prepareStatement(query); ResultSet rs = ps.executeQuery(); while (rs.next()) { String key = rs.getString(1); String value = rs.getString(2); if (StringUtils.isNotBlank(key) && StringUtils.isNotBlank(value)) { log.debug("load property. Key=" + key + ",Value=" + value); props.setProperty(key, value); } } rs.close(); ps.close(); } catch (Exception e) { log.error(e.getMessage()); } finally { if (connection != null) { try { connection.close(); } catch (Exception e) { log.error(e.getMessage()); } } } } }
这样 更灵活,参数在数据库里自己配,项目中可以 调用 DatabaseProperties Properties props 取得 配置的信息;
参考原文博客:
http://blog.csdn.net/maoxiang/article/details/4829553
相关推荐
### Spring读取Properties文件的核心知识点 #### 1. **引入PropertyPlaceholderConfigurer** 在Spring的配置文件中,首先需要定义一个`PropertyPlaceholderConfigurer` bean,这是Spring用来解析Properties文件并...
本篇将详细讲解如何在Java中读取`properties`文件并将其内容转换为`Map`对象。 1. **properties文件结构** `properties`文件的结构非常简单,每行代表一个键值对,键和值之间用等号`=`或冒号`:`分隔。例如: ``` ...
本篇文章将深入探讨如何在Spring中读取不同目录下的配置文件,以及使用`ClassPathXmlApplicationContext`和`FileSystemXmlApplicationContext`这两种不同的上下文环境来加载它们。 首先,让我们了解`...
在Java编程中,读取`.properties`文件是常见的任务,这些文件通常用于存储配置信息,如数据库连接参数。本文将详细介绍如何使用Java读取`.properties`文件并利用这些信息连接到数据库。 首先,我们需要理解`....
在Spring Boot应用中,多模块配置文件的读取是一个重要的实践,它有助于提高代码的可维护性和模块化。本文将详细探讨如何在Spring Boot的多模块项目中管理和使用不同的配置文件,以实现低耦合的设计。 首先,了解...
本教程将深入探讨如何使用Quartz与Spring框架结合来创建一个能从数据库读取配置的定时任务。 Quartz是一个开源的作业调度框架,它提供了丰富的API和功能,可以用来安排和执行任务。Spring框架则是一个全面的企业级...
这篇博客“spring mvc 读取配置文件”将深入探讨如何在Spring MVC中读取和使用配置文件,以及相关工具的应用。 首先,Spring MVC中的配置文件通常是指XML配置文件,如`applicationContext.xml`或`servlet-context....
本文将详细介绍如何在Java中读取`properties`配置文件。 首先,我们需要了解`properties`文件的格式。一个标准的`.properties`文件通常包含多个行,每行由一个键和一个值组成,它们之间用等号(`=`)或冒号(`:`)...
"SSM 读取properties文件"这个话题聚焦于如何在项目中有效地读取和使用这些配置文件。properties文件通常用于存储应用程序的配置参数,如数据库连接信息、服务器端口、邮件服务设置等,使得这些关键信息能够独立于...
这时,需要将路径改为 classpath*:config.properties,以便加载所有的配置文件。 例如: ```xml ignore-unresolvable="true" location="classpath:/jdbc.properties, classpath*:/config.properties"/> ``` ...
当我们的应用程序被打包成JAR文件后,有时我们需要从JAR内部读取配置文件,例如application.properties或application.yml。本文将深入探讨如何在Spring框架中实现这一功能。 首先,理解Spring的资源配置。Spring...
本教程将深入探讨如何在Spring中以不同的方式读取properties文件,以便更好地理解和应用这些配置。 首先,我们需要一个`application.properties`或`application.yml`文件,其中包含键值对。例如: ```properties ...
在`spring-demo09-读取properties配置文件内容`这个示例中,我们可能有一个名为`application.properties`或`config.properties`的文件,存放在项目的`src/main/resources`目录下。这个文件通常包含以下格式的键值对...
Spring读取Properties文件实例解析 Spring框架中,读取Properties文件是一个非常重要的步骤,Properties文件中存储着应用程序的配置信息,如数据库连接信息、Server配置信息等。在Spring应用程序中,我们可以使用@...
在上面的配置中,`${db.driver}`、`${db.url}`、`${db.username}`和`${db.password}`都是从Properties文件中读取的属性值。Spring会自动替换这些占位符,使得我们的数据源bean能够正确连接到数据库。 除了上述方法...
通过属性文件读取数据库连接信息,可以方便地管理和更新数据库配置,同时避免硬编码,提高代码的可维护性。在实际开发中,根据业务场景选择单数据源、多数据源或动态数据源,确保系统的稳定性和扩展性。
Spring Boot提供了多种方式来读取和使用这些配置文件,使其更加便捷和高效。以下将详细介绍Spring Boot读取配置文件的常用方法。 1. **属性文件** Spring Boot默认支持两种主要的属性文件格式:`application....
总结来说,Java提供了多种方式来读取`.properties`配置文件,包括标准库中的`Properties`和`ResourceBundle`,以及NIO、Spring框架和第三方库如Apache Commons Configuration。选择哪种方式取决于你的具体需求,如...
使用`InputStream`来读取Properties文件,然后调用`load()`方法加载文件内容。这通常在程序启动时进行。 ```java try { InputStream input = new FileInputStream("config.properties"); prop.load(input); } ...
1. **读取Properties文件** - 使用`java.util.Properties`类:这是Java提供的标准类,用于处理Properties文件。首先,我们需要加载文件到Properties对象中,然后可以通过关键字获取对应的值。 ```java Properties...