データソースやFTPサーバーなどのリソースを構成する場合、これらの構成情報を独立した外部属性ファイルに配置し、スプリング構成ファイルの$ {user}や$ {password}などのプレースホルダーを介して属性ファイルの属性項目を参照できます。
この構成には2つの利点があります。
Springは、Beanをロードするときに外部プロパティファイルを参照できるプロパティプレイスホルディングコーンフィギュアを提供します。 PropertyPlaceHolderConfigurerは、BeanFactoryPostProcessorBeanインターフェイスを実装しているため、Bean Factory PostProcessorです。
1基本的な引用
1.1 PropertyPlaceHolderConFigurerメソッド(XML設定)
Beanのデータソースを定義する必要があるとします。
<bean id = "dataSource" Destroy-method = "close" p:driverclassname = "com.mysql.jdbc.driver" p:url = "jdbc:mysql://127.0.0.1:3306/spring4" p:username = "root" p: "/>
ここでは、ドライバーのクラス名、JDBC URL、およびデータベースのユーザー名とパスワードは、XMLで直接記述されています。このようにして、展開中にデータベース構成情報を変更する必要がある場合は、最初にXMLを見つけてから変更する必要があります。これは不便です。
名前がsystem.pripertiesであると仮定して、この情報を構成ファイルに抽出することをお勧めします。
DriverClassName = com.mysql.jdbc.driverurl = jdbc:mysql://127.0.0.1:3306/spring4username = rootpassword =
属性ファイルは複数の属性を定義でき、各属性の形式は属性名=属性值のとおりです。
スプリング構成:
<! - 外部プロパティの紹介ファイル - > <bean p:location = "classpath:system.properties" p:fileencoding = "utf-8"/> <! - > <bean id = "datasource" destroy-method = "close" p:driverclassname = "$ {driverclassname}" P:username = "$ {username}" p:password = "$ {password}"/>この構成の後、展開するときにこの構成ファイルに注意を払う必要があります。
PropertyPlaceHolderConFigurerプロパティの説明は次のとおりです。
| 財産 | 説明します |
|---|---|
| 位置 | プロパティファイルへのパスを指定します。 |
| 場所 | 複数の属性ファイルへのパスを指定します。 |
| ファイルエンコード | ファイルのエンコード形式。指定されていない場合、Springはオペレーティングシステムのデフォルトエンコード形式を使用して、ファイルの内容を読み取ります。 |
| 注文 | 複数のPropertyPlaceHolderConFigurersが構成ファイルで定義されている場合、このプロパティを介して優先順位を指定できます。 |
| PlaceHolderPrefix | プレースホルダーの接尾辞、デフォルトは$ {。 |
| PlaceHolderSuffix | プレースホルダープレフィックス、デフォルトは}です。 |
1.2コンテキスト:Property-PlaceHoderメソッド(XML設定)
Context NameSpaceを使用してプロパティファイルを定義できます。これは、PropertyPlaceHolderConfigurerの構成方法よりもエレガントです。
<コンテキスト:プロパティプレイスホルダーlocation = "classpath:system.properties" file-encoding = "utf-8"/>
この方法では、プロパティを暗号化する必要がありますが、データベーステーブルを使用して構成情報を保存する高度な機能を必要としますが、PropertyPlaceHolderConfigurerクラスを拡張し、前述のBean構成方法を採用する必要があります。
1.3 @valueメソッド(注釈またはJavaクラスの構成に基づく)
注釈付きの豆は、@valueが注釈された豆のメンバー変数またはメソッドにプロパティ値を自動的に注入できます。
@componentpublic class customdatasource {@value( "$ {driverclassname}")private string driverclassname; @value( "$ {url}")private string url; @value( "$ {username}")private string username; @value( "$ {password}")プライベート文字列パスワード。 // Getter/Setterを省略}Javaクラス自体に基づいて@Configurationに注釈を付けるクラスは、@Componentを注釈するため、その参照方法は注釈構成に基づく参照メソッドと同じです。
注:使用中に、参照された属性値が属性ファイルとタイプマッチに存在することを確認してください。そうしないと、例外がスローされます。
2暗号化属性値
非感受性属性情報の場合、属性ファイルのプレーンテキストに表示することは合理的ですが、属性情報が機密情報(データベースのユーザー名やパスワードなど)である場合は、ciphertextに保存することをお勧めします。機密情報がciphertextに保存されている場合、サーバーログインの許可を持っている人なら誰でも、システムセキュリティに影響する機密情報が表示されるためです。
特に高いセキュリティ要件(銀行、公共セキュリティシステムなど)を必要とするシステムの場合、この機密情報は、少数の特定のメンテナンス担当者の手にあるはずです。したがって、この情報を暗号化してから、スプリングコンテナがファイルを読み取った後にファイルを復号化する必要があります。
PropertyPlaceHolderConfigurerは、PlaceholderConfigurerSupportクラスから継承します。これは、使用する前にプロパティを変換する方法を設計します。
| 方法 | 説明します |
|---|---|
| ConvertProperty(String PropertyName、String PropertyValue) | 各プロパティ値がロードされて読み取られると、この方法はそれを変換するために呼び出されます。 |
| string convertPropertyValue(String originalValue) | これは、パラメーターが属性値にのみ渡されることを除いて、以前の方法に似ています。 |
| void convertProperties(プロパティ小道具) | すべての属性値を変換します。 |
デフォルトでは、これら3つは空の方法です。 PropertyPlaceHolderConfigurerを拡張して、対応する変換方法をオーバーライドして、暗号化されたプロパティ値ファイルをサポートできます。
2.1暗号化と復号化ツールクラス
情報の暗号化は、対称と非対称の2つの方法に分けられます。対称的には、暗号化された情報を復号化できることを意味しますが、非対称メソッドは暗号化された情報に基づいて元の値として解読できません。 MD5は非対称暗号化に属し、DESは対称暗号化に属します。したがって、ここではDESを使用して属性値を暗号化します。属性値を読み取るときは、DESを使用してそれを復号化します。
DES暗号化と復号化ツールのソースコードについては、ここをクリックしてください。
暗号化と復号化の命令:
DES暗号化および復号化ツールを使用して、コマンドラインを介してデータベースアカウントとパスワードを暗号化します。次に、暗号化された文字列をSystem.Propertiesに書き込みます。これは次のとおりです。
username = q5l+2pprspq = password = udyjsvkxc/q =
2.2属性ファイルの値を暗号化します
まず、復号化変換をサポートする属性コンフィギュレーターをカスタマイズします。
Public Class CustomPropertyPlaceHolderConFigurerは、PropertyPlaceHolderConFigurer { / *** des key* / private static final string key_str = "123456"; / ***値暗号化されたプロパティ名グループ*/ public static final string [] encrypt_property_names = new String [] {"username"、 "password"}; @Override Protected String ConvertProperty(String PropertyName、String PropertyValue){if(!isDecrypt(propertyName)){return PropertyValue; } // decrypt return new des(key_str).decrypt(propertyValue); } / ** * * * * @param propertyname propertyname propertyname * / private boolean isdecrypt(string propertyname){return arrayutils.contains(encrypt_property_names、propertyname); }}知らせ:
次に、<bean>を使用してカスタム属性ファイルを構成します。
<bean P:location = "classpath:system.properties" p:fileencoding = "utf-8"/>
このようにして、スプリングコンテナは暗号化された属性ファイルをロードできます。とても簡単ではありませんか?
o(∩_∩)o haha〜
自分への3つの引用
Springは、Bean定義の$ {propname}を介して属性の値への参照を許可し、$ {propname}を使用してプロパティファイル内の属性間の相互参照を実装できます。
データベース= spring4driverclassname = com.mysql.jdbc.driverurl = jdbc:mysql://127.0.0.1:3306/$ {database}ここでは、別の属性(データベースインスタンス名)の値が$ {データベース}を介して参照されます。したがって、一部の複雑なプロパティでは、この方法でプロパティの変化を抽出して、構成を最小限に抑えることができます。
注:プロパティ値が長すぎる場合、各行の最後に「/」を追加し、このようにプロパティ値を複数の行に分割できます。
profile.jdbc.url = jdbc:mysql://127.0.0.1:3306/dbname?useunicode = true&charatereCoding/= utf-8/&zerodatetimebehhavior = converttonull
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。