让我们看一下Spring中的Dynamic Property Management。
二手技术:
JDK 1.6.0_31
春天3.1.1
石英1.8.5 Maven的3.0.2
步骤1:建立已完成的专案
如下创建一个Maven项目。 (可以使用Maven或IDE插件来创建它)。
步骤2:图书馆
Spring依赖项已添加到Maven的pom.xml中。
<properties>
<spring.version>3.1.1.RELEASE</spring.version>
</properties>
<dependencies>
<!-- Spring 3 dependencies -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Quartz dependency -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>1.8.5</version>
</dependency>
<!-- Log4j dependency -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
</dependencies>
步骤3:创建DynamicPropertiesFile.properties
DynamicPropertiesFile涵盖了应用程序的动态属性。
# This property defines message content
# Possible values = Text. Default value : Welcome
Message_Content = Welcome Visitor
# This property defines minimum visitor count
# Possible values = positive integer. Default value : 1
Minimum_Visitor_Count = 1
# This property defines maximum visitor count
# Possible values = positive integer. Default value : 10
Maximum_Visitor_Count = 10
步骤4:创建applicationContext.xml
应用程序上下文的创建如下:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- Beans Declaration -->
<!-- Core Dynamic Properties Bean Declaration -->
<bean id="CoreDynamicPropertiesBean" class="org.springframework.beans.factory.config.PropertiesFactoryBean" scope="prototype">
<property name="location" value="classpath:DynamicPropertiesFile.properties" />
</bean>
<!-- Dynamic Properties Map Declaration -->
<bean id="DynamicPropertiesMap" class="java.util.HashMap"/>
<!-- Dynamic Properties File Reader Task Declaration -->
<bean id="DynamicPropertiesFileReaderTask" class="com.otv.dynamic.properties.task.DynamicPropertiesFileReaderTask">
<property name="dynamicPropertiesMap" ref="DynamicPropertiesMap"/>
</bean>
<!-- End of Beans Declaration -->
<!-- Scheduler Configuration -->
<!-- Job Detail-->
<bean id="DynamicPropertiesFileReaderTaskJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="DynamicPropertiesFileReaderTask" />
<property name="targetMethod" value="start" />
</bean>
<!-- Simple Trigger -->
<bean id="DynamicPropertiesFileReaderTaskTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="DynamicPropertiesFileReaderTaskJobDetail" />
<property name="repeatInterval" value="60000" />
<property name="startDelay" value="0" />
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobDetails">
<list>
<ref bean="DynamicPropertiesFileReaderTaskJobDetail" />
</list>
</property>
<property name="triggers">
<list>
<ref bean="DynamicPropertiesFileReaderTaskTrigger" />
</list>
</property>
</bean>
<!-- End of Scheduler Configuration -->
</beans>
步骤5:建立SystemConstants类别
创建一个新的SystemConstants类。 此类涵盖所有系统常数。
package com.otv.common;
/**
* System Constants
*
* @author onlinetechvision.com
* @since 26 May 2012
* @version 1.0.0
*
*/
public class SystemConstants {
//Names of Dynamic Properties...
public static final String DYNAMIC_PROPERTY_MESSAGE_CONTENT = "Message_Content";
public static final String DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT = "Minimum_Visitor_Count";
public static final String DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT = "Maximum_Visitor_Count";
//Default Values of Dynamic Properties...
public static final String DYNAMIC_PROPERTY_MESSAGE_CONTENT_DEFAULT_VALUE = "Welcome";
public static final String DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT_DEFAULT_VALUE = "1";
public static final String DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT_DEFAULT_VALUE = "10";
public static final String BEAN_NAME_CORE_DYNAMIC_PROPERTIES_BEAN = "CoreDynamicPropertiesBean";
public static final String APPLICATION_CONTEXT_FILE_NAME = "applicationContext.xml";
}
步骤6:创建DynamicPropertiesFileReaderTask类
DynamicPropertiesFileReaderTask类已创建。 此类由Quartz管理。 它通过每分钟调用“ start”方法,通过DynamicPropertiesFile读取所有动态属性。 可以通过applicationContext.xml更改阅读时间。
请注意,默认情况下coreDynamicPropertiesBean的作用域为Singleton 。 它必须在运行时返回动态属性的新值,因此应将其范围设置为Prototype 。 否则,将无法接收新值。
package com.otv.dynamic.properties.task;
import java.util.HashMap;
import java.util.Properties;
import org.apache.log4j.Logger;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import com.otv.common.SystemConstants;
/**
* Dynamic Properties File Reader Task
*
* @author onlinetechvision.com
* @since 26 May 2012
* @version 1.0.0
*
*/
public class DynamicPropertiesFileReaderTask implements BeanFactoryAware {
private static Logger logger = Logger.getLogger(DynamicPropertiesFileReaderTask.class);
private Properties coreDynamicPropertiesBean;
private HashMap<String, String> dynamicPropertiesMap;
private BeanFactory beanFactory;
/**
* Starts reading the dynamic properties
*
*/
public void start() {
setCoreDynamicPropertiesBean(createCoreDynamicPropertiesBeanInstance());
logger.info("**** Dynamic Properties File Reader Task is being started... ****");
readConfiguration();
logger.info("**** Dynamic Properties File Reader Task is stopped... ****");
}
/**
* Reads all the dynamic properties
*
*/
private void readConfiguration() {
readMessageContent();
readMinimumVisitorCount();
readMaximumVisitorCount();
}
/**
* Reads Message_Content dynamic property
*
*/
private void readMessageContent() {
String messageContent = getCoreDynamicPropertiesBean()
.getProperty(SystemConstants.DYNAMIC_PROPERTY_MESSAGE_CONTENT,
SystemConstants.DYNAMIC_PROPERTY_MESSAGE_CONTENT_DEFAULT_VALUE);
if (messageContent.equals("")){
getDynamicPropertiesMap().put(SystemConstants.DYNAMIC_PROPERTY_MESSAGE_CONTENT,
SystemConstants.DYNAMIC_PROPERTY_MESSAGE_CONTENT_DEFAULT_VALUE);
logger.error(SystemConstants.DYNAMIC_PROPERTY_MESSAGE_CONTENT +
" value is not found so its default value is set. Default value : " +
SystemConstants.DYNAMIC_PROPERTY_MESSAGE_CONTENT_DEFAULT_VALUE);
} else {
messageContent = messageContent.trim();
getDynamicPropertiesMap().put(SystemConstants.DYNAMIC_PROPERTY_MESSAGE_CONTENT, messageContent);
logger.info(SystemConstants.DYNAMIC_PROPERTY_MESSAGE_CONTENT + " : " +
getDynamicPropertiesMap().get(SystemConstants.DYNAMIC_PROPERTY_MESSAGE_CONTENT));
}
}
/**
* Reads Minimum_Visitor_Count dynamic property
*
*/
private void readMinimumVisitorCount() {
String minimumVisitorCount = getCoreDynamicPropertiesBean()
.getProperty(SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT,
SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT_DEFAULT_VALUE).trim();
try {
if (Integer.parseInt(minimumVisitorCount) > 0){
getDynamicPropertiesMap().put(SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT,
minimumVisitorCount);
logger.info(SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT + " : " +
getDynamicPropertiesMap().get(SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT));
} else {
getDynamicPropertiesMap().put(SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT,
SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT_DEFAULT_VALUE);
logger.error("Invalid "+SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT +
" value encountered. Must be greater than 0. Its default value is set.
Default value : "+ SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT_DEFAULT_VALUE);
}
} catch (NumberFormatException nfe) {
logger.error("Invalid "+SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT +
" value encountered. Must be numeric!", nfe);
logger.warn(SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT +
" default value is set. Default value : " +
SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT_DEFAULT_VALUE);
}
}
/**
* Reads Maximum_Visitor_Count dynamic property
*
*/
private void readMaximumVisitorCount() {
String maximumVisitorCount = getCoreDynamicPropertiesBean()
.getProperty(SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT,
SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT_DEFAULT_VALUE).trim();
try {
if (Integer.parseInt(maximumVisitorCount) > 0){
getDynamicPropertiesMap().put(SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT, maximumVisitorCount);
logger.info(SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT + " : " +
getDynamicPropertiesMap()
.get(SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT));
} else {
getDynamicPropertiesMap().put(SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT,
SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT_DEFAULT_VALUE);
logger.error("Invalid "+SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT +
" value encountered. Must be greater than 0. Its default value is set. Default value : " +
SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT_DEFAULT_VALUE);
}
} catch (NumberFormatException nfe) {
logger.error("Invalid "+SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT +
" value encountered. Must be numeric!", nfe);
logger.warn(SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT +
" default value is set. Default value : " +
SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT_DEFAULT_VALUE);
}
}
/**
* Gets CoreDynamicPropertiesBean
*
* @return Properties coreDynamicPropertiesBean
*/
public Properties getCoreDynamicPropertiesBean() {
return coreDynamicPropertiesBean;
}
/**
* Sets CoreDynamicPropertiesBean
*
* @param Properties coreDynamicPropertiesBean
*/
public void setCoreDynamicPropertiesBean(Properties coreDynamicPropertiesBean) {
this.coreDynamicPropertiesBean = coreDynamicPropertiesBean;
}
/**
* Gets DynamicPropertiesMap
*
* @return HashMap dynamicPropertiesMap
*/
public HashMap<String, String> getDynamicPropertiesMap() {
return dynamicPropertiesMap;
}
/**
* Sets DynamicPropertiesMap
*
* @param HashMap dynamicPropertiesMap
*/
public void setDynamicPropertiesMap(HashMap<String, String> dynamicPropertiesMap) {
this.dynamicPropertiesMap = dynamicPropertiesMap;
}
/**
* Gets a new instance of CoreDynamicPropertiesBean
*
* @return Properties CoreDynamicPropertiesBean
*/
public Properties createCoreDynamicPropertiesBeanInstance() {
return (Properties) this.beanFactory.getBean(SystemConstants.BEAN_NAME_CORE_DYNAMIC_PROPERTIES_BEAN);
}
/**
* Sets BeanFactory
*
* @param BeanFactory beanFactory
*/
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
}
步骤7:创建应用程序类
应用程序类启动项目。
package com.otv.starter;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.otv.common.SystemConstants;
/**
* Application Starter Class
*
* @author onlinetechvision.com
* @since 26 May 2012
* @version 1.0.0
*
*/
public class Application {
/**
* Main method of the Application
*
*/
public static void main(String[] args) {
new ClassPathXmlApplicationContext(SystemConstants.APPLICATION_CONTEXT_FILE_NAME);
}
}
第8步:运行项目
如果运行应用程序类,则显示以下控制台日志:
26.05.2012 17:25:09 INFO (DefaultLifecycleProcessor.java:334) - Starting beans in phase 2147483647
26.05.2012 17:25:09 INFO (SchedulerFactoryBean.java:648) - Starting Quartz Scheduler now
26.05.2012 17:25:09 INFO (PropertiesLoaderSupport.java:177) - Loading properties file from class path resource [DynamicPropertiesFile.properties]
26.05.2012 17:25:09 INFO (DynamicPropertiesFileReaderTask.java:36) - **** Dynamic Properties File Reader Task is being started... ****
26.05.2012 17:25:09 INFO (DynamicPropertiesFileReaderTask.java:63) - Message_Content : Welcome Visitor
26.05.2012 17:25:09 INFO (DynamicPropertiesFileReaderTask.java:76) - Minimum_Visitor_Count : 1
26.05.2012 17:25:09 INFO (DynamicPropertiesFileReaderTask.java:96) - Maximum_Visitor_Count : 10
26.05.2012 17:25:09 INFO (DynamicPropertiesFileReaderTask.java:38) - **** Dynamic Properties File Reader Task is stopped... ****
26.05.2012 17:26:09 INFO (PropertiesLoaderSupport.java:177) - Loading properties file from class path resource [DynamicPropertiesFile.properties]
26.05.2012 17:26:09 INFO (DynamicPropertiesFileReaderTask.java:36) - **** Dynamic Properties File Reader Task is being started... ****
26.05.2012 17:26:09 INFO (DynamicPropertiesFileReaderTask.java:63) - Message_Content : Welcome Visitor, Bruce!
26.05.2012 17:26:09 INFO (DynamicPropertiesFileReaderTask.java:76) - Minimum_Visitor_Count : 2
26.05.2012 17:26:09 INFO (DynamicPropertiesFileReaderTask.java:96) - Maximum_Visitor_Count : 20
26.05.2012 17:26:09 INFO (DynamicPropertiesFileReaderTask.java:38) - **** Dynamic Properties File Reader Task is stopped... ****
步骤9:下载
OTV_SpringDynamicPropertyManagement
参考资料:
参考: Online Technology Vision博客中的JCG合作伙伴 Eren Avsarogullari提供的Spring动态物业管理 。
翻译自: https://www.javacodegeeks.com/2012/05/dynamic-property-management-in-spring.html