`

JAVA开发 资料收集 之 单例模式加载项目相关配置信息的类

 
阅读更多

   负责加载整个项目的配置信息

   技术点:懒汉式单例模式  

  

package com.cici.demo.singleton;

import java.io.IOException;
import java.util.Iterator;
import java.util.Properties;
import java.util.Map.Entry;

import org.apache.log4j.Logger;

public class Configuration {
	/*Singleton*/
		/*the configuration properties file Path*/
		private final static String DEFAULT_CONFIGURATION_FILE_PATH = "/com/cici/demo/migration.properties";
		private static Configuration instance = null;
		public static Properties props = null;
		private final static Logger logger = Logger.getLogger (Configuration.class);
		/*Lazy loading*/
		//The only way to construct new instance
		public static synchronized Configuration getInstance(){
			
			if(instance == null){
				props = new Properties();
				instance = new Configuration();
				try {
					props.load(Configuration.class.getResourceAsStream (DEFAULT_CONFIGURATION_FILE_PATH));
				} catch (IOException e) {
					logger.error(e,e);
				}
			}
			return instance;
		}
		/*parameter format:xxx=xxx*/
		public static synchronized Configuration getInstance(final String[] args){
			if(instance==null) {
				props = new Properties();
				instance = new Configuration();
			}
		    	//First load the default config
		    	try{
		    		
		    		props.load(Configuration.class.getClass ().getResourceAsStream (DEFAULT_CONFIGURATION_FILE_PATH));
		    	}catch(final IOException e){
		    		logger.error(e,e);
		    	}
		    	 // Go through the command line arguments, and override the default config
		        for (final String arg: args) {
		            parseArgument (arg);
		        }
			
	        return instance;
		}
		/*The format of the argument: XX,XX*/
	    private static void parseArgument(final String argument){
	    	final String[] spligArg = argument.split("=");
	    	if(spligArg.length!=2) {
	    		logger.warn("Command line argument using wrong format"+argument);
	    	}else{
	    		props.put(spligArg[0], spligArg[1]);
	    	}
	    }
	    @Override
	    public String toString(){
	    	String configPart = "";
	    	final Iterator<Entry<Object,Object>> it = props.entrySet().iterator();
	    	while(it.hasNext()){
	    		final Entry<Object,Object> entry = it.next();
	    		configPart+=entry.getKey()+"="+entry.getValue();
	    		if(it.hasNext()){
	    			configPart+=",";
	    		}
	    	}
	    	return "Configurations ["+configPart+"]";
	    }
	    /**
	     * Returns the {@link String} value of a configuration parameter. This is the default value form
	     * when read from the configuration file.
	     * 
	     * @param name The name of the value to return
	     * @return the value from the map
	     */
	    public String getValue (final String name) {
	        return props.getProperty (name);
	    }


	    /**
	     * Add a value to the configuration map
	     * 
	     * @param name Name of the new value
	     * @param value Value to insert
	     */
	    public void putValue (final String name, final Object value) {
	        props.put (name, value);
	    }


	    /**
	     * Returns a value, converted to {@link Integer}
	     * 
	     * @param name the name of the configuration value
	     * @return converted value
	     */
	    public Integer getIntValue (final String name) {
	        return Integer.parseInt (props.getProperty (name));
	    }


	    /**
	     * Returns a value converted to {@link Long}
	     * 
	     * @param name the name of the configuration value
	     * @return converted value
	     */
	    public Long getLongValue (final String name) {
	        return Long.parseLong (props.getProperty (name));
	    }
	}

 

 

    要加载的配置文件的路径

    /src/com/cici/demo/migration.properties

name=cici
password=cici123love
address=jiangfujiayuan

    多线程测试 该单例实例变量

   

package com.cici.demo.multithread;
import com.cici.demo.singleton.Configuration;
public class TestMuiltyThread {
 public static void main(String[] args) {
  Th1 t1   = new Th1();
  Th2 t2 =  new Th2();
  Th3 t3 = new Th3();
  Th4 t4 = new Th4();
  t1.start();
  t2.start();
  t3.start();
  t4.start();
 }
 
 
}
class Th1 extends Thread{
 public void run() {
  Configuration con = Configuration.getInstance();
  System.out.println(Thread.currentThread().getName()+"    "+con.props.size());
 }
}
class Th2 extends Thread{
 @Override
 public void run() {
  String[] strs = {"f1=lili","f2=titi","f3=mimi"};
  Configuration conn = Configuration.getInstance(strs);
  System.out.println(Thread.currentThread().getName()+"    "+conn.props.size()); 
 }
}
class Th3 extends Thread{
 @Override
 public void run() {
  String[] strs2 = {"f4=lili","f5=titi","f6=mimi"};
  Configuration connn = Configuration.getInstance(strs2);
  System.out.println(Thread.currentThread().getName()+"    "+connn.props.size());
 }
}
class Th4 extends Thread{
 @Override
 public void run(){
  Configuration connn = Configuration.getInstance();
  connn.putValue("f7", "gogo");
  connn.putValue("f8", "momo");
  System.out.println(Thread.currentThread().getName()+"    "+connn.props.size());
  
 }
}
  

   输出结果

  

Thread-0    3
Thread-2    6
Thread-1    9
Thread-3    11

 

分享到:
评论

相关推荐

    java开发所需要的帮助文档

    9. **设计模式**:Java开发中,熟练运用单例、工厂、观察者、装饰者等设计模式可以提高代码可读性和可维护性。 10. **Java标准库**:包括Collections、Lang、Util等包中的工具类,以及Swing或JavaFX用于构建图形...

    JAVA开发实战经典PPT.rar

    12. **设计模式**:讲解常见的设计模式,如工厂模式、单例模式、观察者模式、装饰器模式等,以及如何在实际项目中灵活运用。 通过学习这本“JAVA开发实战经典PPT”,开发者不仅可以掌握Java编程的基本技能,还能...

    【Java面试资料】-(机构内训资料)上海-拼多多-Java高级

    这份资料全面覆盖了Java高级开发所需的知识点,对于希望在上海拼多多或其他公司从事Java开发的求职者来说,是一份宝贵的复习资源。通过深入学习和理解这些内容,可以显著提高面试成功率,并在实际工作中展现出更高效...

    2018最新最全java高级工程师面试题

    - 创建型模式:单例模式、工厂模式、建造者模式、原型模式等,以及它们在实际项目中的应用。 - 结构型模式:适配器模式、装饰器模式、代理模式、桥接模式、组合模式等。 - 行为型模式:策略模式、观察者模式、...

    Java学习资料 学习资料、课堂作业、笔记

    12. **JVM原理**: 学习Java虚拟机的工作原理,包括类加载机制、内存管理、垃圾收集,有助于优化程序性能。 13. **单元测试**: 使用JUnit或TestNG进行单元测试,确保代码的质量和可靠性。 14. **Maven项目管理**: ...

    java经常用到的面试题,多年收集公司的面试资料整理

    在Java开发领域,面试是评估求职者技能的重要环节。以下是对给定文件中涉及的Java面试知识点的详细解析: ### 第一章 技巧篇 1. **自我介绍**:面试开始时,良好的自我介绍至关重要。应简洁明了地介绍自己的教育...

    java面试 java书籍

    - 掌握常见的设计模式,如工厂模式、单例模式、观察者模式等,理解它们在实际项目中的应用。 9. **Spring框架** - **依赖注入**:理解IoC(控制反转)和DI(依赖注入)的概念,以及如何通过XML或注解实现。 - **...

    java后端开发面试题总结

    Java后端开发是软件开发领域中的重要组成部分,主要负责服务器端的逻辑处理、数据库交互以及与前端的通信等任务。面试题是评估开发者技能水平的重要工具,以下将根据"java后端开发面试题总结"这一主题,深入探讨相关...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    阿里巴巴Java开发规范手册 UMPAY——编码规范 日志规范 异常规范 网络 协议 TCP/IP HTTP hession file HTTPS 负载均衡 容器 JBOSS tomcat resin jetty 容灾 日志框架 开源框架 slf4j 框架实现...

    java面试评价表

    - **设计模式**:了解面试者对面向对象设计原则的熟悉程度,包括单例模式、工厂模式、观察者模式等。 #### 二、Java多线程 - **线程池原理**:解释为何需要线程池,以及线程池的工作原理。 - **线程的生命周期**:...

    张孝祥Java高新技术_源代码

    7. **设计模式**:在Java开发中,设计模式是解决问题的常用策略,如工厂模式、单例模式、装饰器模式和观察者模式等。这些模式提高了代码的可读性和可复用性。 8. **注解(Annotation)**:Java注解是一种元数据,...

    java开源面试题大全

    接着,《java面试笔试题大汇总 JAVA相关基础知识.doc》是对Java基础知识的全面梳理,可能包括了类加载机制、反射、枚举、内部类、Lambda表达式、注解、泛型等进阶话题。这些都是Java开发中的重要组成部分,理解并能...

    Java高级面试题和常见面试及答案汇总.rar

    - 单例模式、工厂模式、装饰器模式、代理模式等23种设计模式的应用与理解。 - 模式在实际项目中的实践,提高代码可读性和可维护性。 6. **Java高级特性** - Lambda表达式:函数式编程的概念和Java 8中的应用。 ...

    Java面试题资料超全.rar

    - 单例模式、工厂模式、建造者模式、观察者模式等23种经典设计模式。 - 模式在实际项目中的应用和场景分析。 9. **JVM** - 内存模型:堆内存、栈内存、方法区、本地方法栈、程序计数器。 - 垃圾回收:GC原理,...

    Java夜未眠

    - **设计模式**:工厂模式、单例模式、观察者模式等常见设计模式在Java中的应用。 - **IO流**:包括字节流和字符流,以及缓冲流、转换流和对象流的使用。 3. **Java网络编程**: - **Socket编程**:创建服务器端...

    Java_技术金矿收集和共享物资资源.zip

    "Java_技术金矿收集和共享物资资源.zip"这个压缩包文件名暗示了它可能包含一系列与Java学习和开发相关的资源,旨在帮助开发者提升技能和获取最新知识。下面将详细解析其中可能涵盖的知识点,并探讨其重要性和应用。 ...

    Java面试题大全_300个以上面试题加答案_最后附加例子

    Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。为了在激烈的求职竞争中脱颖而出,Java开发者需要对这门语言有深入的理解,并能够应对各种面试挑战。这份"Java面试题大全"涵盖了超过300...

    JAVA共舞里的所有精华帖子

    3. 类加载器:理解类加载机制,避免类装载冲突,合理使用自定义类加载器,有助于提升系统性能。 4. JIT编译器:HotSpot JVM中的Just-In-Time编译器能将频繁执行的热点代码编译成机器码,提高运行速度。了解何时启用...

    java 高级工程师面试题

    Java高级工程师面试题涵盖了许多关键领域,旨在评估候选人在编程、设计模式、并发处理、内存管理、性能优化、框架理解及...通过深入理解和实践这些内容,可以提升你在Java开发领域的专业素养,增加获得理想职位的机会。

    java后端开发知识点整理

    - **设计模式**:工厂模式、单例模式、观察者模式、装饰器模式、策略模式等23种经典设计模式的理解与应用。 - **SOLID原则**:单一职责、开闭原则、里氏替换、接口隔离、依赖倒置原则。 - **构造函数与工厂方法**...

Global site tag (gtag.js) - Google Analytics