魂の拷問:サービスを再起動せずに構成の変更を有効にする方法は?トリックはありますか?
魂の拷問:Javaプロジェクトでは、拡張子が.propertiesのファイルのトレースを常に表示できますが、これらの構成ファイルはどのようにロードされますか?
プロジェクト開発プロセス中に、接続するデータベースの接続アドレス、名前、ユーザー名、パスワードなど、頻繁に変更されるいくつかのパラメーターに遭遇する場合があります(たとえば、3者サービスにアクセスするためのURL)。プログラムの多様性を考慮すると、これらのパラメーターはプログラムに直接書き込むことができないことが多く、通常は構成ファイルを使用して適切に処理されます。
Javaプロジェクトでは、プロパティファイルはより単純なカテゴリに属しますが、単純ですが、プロジェクトでの使用方法について説明する必要があります。ソースコードを理解して、Javaの深い経験をもたらすようにしてください。オーバーロードの意味。
1.その単純さにもかかわらず、フォーマットはまだ見られる必要があります。
前回説明したini構成ファイルと比較すると、プロパティファイルの形式にはセクションの概念はありませんが、はるかに単純です。
上記の画像は、jdbc接続に必要な構成です。#で始まる各行はコメント情報であり、等号で区切られた各行構成は、一般的にキーと値のペアと呼ばれ、等号の左側がキーです(コード内)変数)、等号の右側の値は値(実際のシナリオに従って構成された値)です。
2.その単純さにもかかわらず、Javaソースコードは引き続きチェックする必要があります。
java.util.PropertiesクラスはJavaで提供され、主に構成ファイルの読み取りと書き込みに使用されます。
1つの画像は血の関係を把握しています。明らかに、PropertiesはHashtableを継承しています。最終的な分析では、それはマップであり、Propertiesの最も特別な場所は、そのキーと値がすべて文字列型であることです。
全体的な状況から概要を理解し、JDKのソースコードを調べ、そのアイデアに従い、段階的に進んでください。
まず、書き込まれた構成ファイルがどのようにロードされるかを見てみましょう。
ソースコードは非常に明確で、文字ストリームリーダーとバイトストリームInputStreamを提供して構成ファイルをロードし(メソッドオーバーロードの目的:ユーザーをより便利にするため)、さらに深く進んで、最終的なputハッシュテーブルのput(キー、値)を設定しますキーと値のペア、最後に構成ファイルをロードします。
次に、キーに基づいて対応する値を取得する方法を確認するには(それを入力しますが、それを取り出すことも検討してください)?
ソースコードは非常に明確です。対応する値はパラメーターキーを介して取得されます。ユーザーの利便性を考慮して、getPropertyメソッドはオーバーロードされます。キーに従って取得された値がnullの場合、2とマークされたメソッドが返されます。デフォルト値(多くのシナリオでは、それは本当に便利です)。
構成ファイルをロードする方法を知っており、キーに対応する値を取得する方法を知っています。常識的には、プロジェクトで十分ですが、プロジェクトの開始後、追加のパラメーター値を設定する必要がある場合もありますが、Javaこのことを考慮して、追加のパラメーターを設定できるようにするために、setPropertyメソッドが提供されています。
プロジェクト開発でこれらのAPIを上手に使用できれば十分です。ソースコードが開かれたので、さまざまなことがすべて説明されています。おそらく一部のAPIは、他のシナリオで発生する問題を解決することもできます。
Propertiesクラスは、設定をロードするための負荷を提供するだけでなく、キーと値のペアをファイルに書き込む機能も提供します。上記のソースコードに示すように、ユーザーの利便性を考慮して、storeメソッドはオーバーロードされ、バイトストリームOutputStreamと文字ストリームWriterの2つのストア方法を提供します。
上記のソースコードに示されているように、Propertiesは、従来の構成ファイルの読み取り機能と書き込み機能のサポートに加えて、xml構成ファイルの読み込みと書き込みのサポートも提供します。
上記のソースコードに示すように、Propertiesクラスはオーバーロードされたリストメソッドを提供します。デバッグを容易にするために、キーと値のペアのリストをきれいに印刷できます。
3.簡単ですが、すべてをナンセンスに練習することはできません。
シナリオ1: APMパフォーマンスの監視中に、Javaアプリケーションプロファイル情報を取得するために一般的に使用されるAPI。
import java.util.Properties; / ** * @author Yiguan Xiaojian * / public class JVMDetails { public static void main(String [] args){ //システム情報を取得(JDK情報、Java仮想マシン情報、Java提供)ビジネス情報、現在のコンピューターのユーザー情報) プロパティproperties = System.getProperties(); //システム情報 を出力しますproperties.list(System.out); } }
プログラムが実行され、いくつかの出力スクリーンショットは次のとおりです。
シナリオ2:ビジネス開発で、ハードコーディングを構成に置き換え、構成の更新を検討すると、プログラムは最新の値を読み取ることができます。
import java.io. *; import java.util.Hashtable; import java.util.Properties; / ** *設定ファイルツール * 1. .propertiesファイル、.iniファイルの読み込みを サポート* 2.設定ファイルの更新をサポート * @ author Ape Story * / public class PropertiesUtil { // private static final Log4j LOG = .....; private static Hashtable <String、PropCache> propCache = new Hashtable <String、PropCache>(); public static String getString( String propFile、String key){ return getString(propFile、key、null); } public static String getString(String propFile、String key、String defaultValue){ if((!PropFile.endsWith( "。Properties"))&&(! propFile.endsWith( ".ini")))){ propFile = propFile + ".properties"; } PropCache prop = propCache.get(propFile); if(prop == null){ try { prop = new PropCache(propFile); } catch(IOException e){ // LOG.warn(e); System.out.println(String.format( "读取%s出现异常%s"、propFile、e)); defaultValueを返します。 } propCache.put(propFile、prop); } 文字列値= prop.getProperty(key、defaultValue); if(value!= null){ value = value.trim(); } 戻り値。 } public static void setString(String propFile、String key、String value) throws IOException { if((!propFile.endsWith( "。properties"))&&(!propFile.endsWith( "。ini"))){ propFile = propFile + "。プロパティ"; } ファイルfile = new File(propFile); プロパティprop = new Properties(); { FileInputStream fis = new FileInputStream(file);を試してください。 prop.load(fis); fis.close(); } catch(FileNotFoundException e){ // LOG.warn(e); System.out.println(String.format( "文件%s存在しない"、propFile)); } FileOutputStream fos = new FileOutputStream(file); public PropCache(String propFileName)はIOExceptionをスローし ます{ File file = new File(propFileName); FileInputStream fis = new FileInputStream(file); prop.put(key、value); prop.store(fos、null); fos.close(); PropCache localPropCache = propCache.get(propFile); if(localPropCache!= null){ localPropCache.reload(); } } private static class PropCache { private String fileName; プライベートlong lastLoad; プライベートプロパティの小道具。 this.prop = new Properties(); this.prop.load(fis); fis.close(); this.fileName = file.getAbsolutePath(); this.lastLoad = file.lastModified(); } public String getProperty(String key、String defaultValue){ File file = new File(this.fileName); if(this.lastLoad <file.lastModified()){ reload(); } return this.prop.getProperty(key、defaultValue); } public void reload(){ File file = new File(this.fileName); {を試す プロパティprop = new Properties(); FileInputStream fis = new FileInputStream(file); prop.load(fis); fis.close(); this.prop.clear(); this.prop.putAll(prop); this.lastLoad = file.lastModified(); } catch(IOException e){ // PropertiesUtil.LOG.warn(e); System.out.println(String.format( "File%s reload exception%s"、 this.fileName、e)); } // PropertiesUtil.LOG.all(new Object [] {this.fileName、 "reloaded。"}); System.out.println(String.format( "File%s is reloaded "、this.fileName)); } } }
最初に説明したjdbc構成ファイルを使用して確認します。データベースタイプを取得してみてください。デフォルトの構成はdb2です。パラメータの値をmysqlに半分変更してください。
/ ** *测试类 * @author一猿小讲 * / public class M { public static void main(String [] args){ while(true){ System.out.println(PropertiesUtil.getString( "db"、 " jdbc.type ")); { Thread.sleep(10000);を試してください。 }キャッチ(InterruptedException e){ } } } }
プログラムが実行され、効果はまだ非常に満足です。
4.シンプルですが、優れた記事は慎重に共有してください。
構成ファイルについては多くのオンライン共有がありますが、私たちの共有は同じではありません。
私たちの当初の目的は、実際のプロジェクトとソースコードを組み合わせて、ここ数年で使用されている構成スキルについて話し、研究開発能力の向上を支援することです(たとえそれが成功したとしても、損失であっても)。
その石はヒスイを攻撃することができます、それはあなたを助けると思います。
研究開発能力を向上させるために(たとえそれが失われたとしても)、フォローアップは実際のプロジェクトを結合し続けて、使用されている他の形式の構成ファイルを確認しますので、しばらくお待ちください。