Spring动态物业管理
让我们看一下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/beanshttp://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
参考资料:
Spring Framework参考3.x
参考: Online Technology Vision博客中的JCG合作伙伴 Eren Avsarogullari提供的Spring动态物业管理 。
翻译自: https://www.javacodegeeks.com/2012/05/dynamic-property-management-in-spring.html
Spring动态物业管理相关推荐
- 【Spring学习】spring动态配置多数据源
这段时间在做智能导航的管理系统--运维系统,涉及到连接多个数据库的问题.因为运维系统要用到智能导航的一些功能,我们目前只是简单的将智能导航整合到运维系统中:运维系统有一个自己的数据库,导航也有自己的数 ...
- 我已经把它摸的透透的了!!!Spring 动态数据源设计实践,全面解析
[ Spring 动态数据源 动态数据源是什么?它能解决什么??? 在实际的开发中,同一个项目中使用多个数据源是很常见的场景.比如,一个读写分离的项目存在主数据源与读数据源. 所谓动态数据源,就是通过 ...
- osgi和spring区别_OSGI和Spring动态模块–简单的Hello World
osgi和spring区别 在此姿势中,我们将采用使用OSGi进行的第一个实现,并使用Spring Dynamic Modules改进应用程序. Spring动态模块(Spring Dm)使基于OSG ...
- OSGI和Spring动态模块–简单的Hello World
在此姿势中,我们将采用使用OSGi进行的第一个实现,并使用Spring Dynamic Modules改进应用程序. Spring动态模块(Spring Dm)使基于OSGi的应用程序的开发更加容易. ...
- 【Spring AOP】静态代理设计模式、Spring 动态代理开发详解、切入点详解(切入点表达式、切入点函数)
AOP 编程 静态代理设计模式 1. 为什么需要代理设计模式 2. 代理设计模式 名词解释 代理开发的核心要素 静态代理编码 静态代理存在的问题 Spring 动态代理开发 搭建开发环境 Spring ...
- 【Spring源码三千问】Spring动态代理:什么时候使用的 cglib,什么时候使用的是 jdk proxy?
Spring动态代理:什么时候使用的 cglib,什么时候使用的是 jdk proxy? 前言 版本约定 正文 例子测试 结论分析 proxyTargetClass 标识的校正 哪些接口不是 Reas ...
- 一文读懂Spring动态配置多数据源---源码详细分析
Spring动态多数据源源码分析及解读 一.为什么要研究Spring动态多数据源 代云小说网 https://www.3187.info 期初,最开始的原因是:想将答题服务中发送主观题答题数据给批 ...
- 从一个Spring动态代理Bug聊到循环依赖
文章目录 Bug复现 结论 @PostConstruct的在Bean的生命周期的哪一步 一般代理类的生成时机在生命周期的哪一步 解决办法 两个思路 1.不生成代理类 2.在生成代理类之后再进行数据的初 ...
- spring动态代理实现计算器
2019独角兽企业重金招聘Python工程师标准>>> 1.ArithmeticCalculator.java package com.huanlgiusong.spring.aop ...
最新文章
- python右对齐函数_python右对齐的实例方法
- sqoop动态分区导入mysql,使用sqoop import从mysql往hive含分区表中导入数据的一些注意事项...
- OpenCV训练SVM模型并预测的完整过程
- 前端分页功能的实现以及原理
- C# 使用PictureBox控件--点击切换图片
- libcareplus支持的补丁类型
- python处理文本
- MFC消息映射与消息传递内幕
- SQL常用命令和操作
- Oracle 逗号分割的字符串转换为可放入in的语句
- qt信号阻塞blockSignals的运用
- 【vue】mint-ui中navbar下划线不显示的问题
- 【LeetCode】86. 分隔链表
- 《工程伦理与学术道德》第四章习题
- 嵌入式培训多少钱?嵌入式学习要了解这些内容!
- 《数值分析》-- 埃尔米特插值与分段插值
- 面试官:说说Redis之I/O多路复用模型实现原理
- Vue Router 实现路由控制实战
- 在Excel中插入行并复制单元格格式
- 加州伯克利市计划发起“首次社区发行”,发售代币化债券
热门文章
- java线程——中断线程+线程状态+线程属性(优先级)
- 设置 JDK环境变量(Windows)
- djl和ljl_使用Spring Boot和DJL进行深度学习
- s71200模拟量输入输出_模拟用户输入并检查输出的简单方法
- java 异常处理发生异常_处理Java中的异常
- aws 堆栈模板_使用Arquillian和LocalStack脱机测试AWS云堆栈
- Apache Camel 3.2 – Camel的无反射配置
- 怎样使set现程变得安全_使不安全变得更加安全
- activemq网络桥接_ActiveMQ –经纪人网络解释–第4部分
- JVM体系结构:JVM中的执行引擎