0

さまざまなソースからデータを取得し、データを操作してから、さまざまな宛先にデータを送信する Java プログラムを開発しています。データを処理するためにプログラム内で使用されるデータ ソース、データ送信先、およびモジュールをプロパティ ファイルでユーザーが定義できるようにする必要があります。

プロパティファイルは次のようになると思います...

dataFlow1 = dataProcessorTypeA
dataFlow1.source = mySource1
dataFlow1.destination = myDestination1
dataFlow2 = dataProcessorTypeA
dataFlow2.source = mySource2
dataFlow2.destination = myDestination2
dataFlow3 = dataProcessorTypeB
dataFlow3.source = mySource3
dataFlow3.successDestination = mySuccessDestination3
dataFlow3.failureDestination = myFailureDestination3
...
dataFlow99 = dataProcessorTypeZ

各データ フローに関連付けられているプロパティは、選択したモジュールによって異なります。したがって、上記の例では、「dataProcessorTypeA」には「source」および「destination」プロパティを設定する必要があり、「dataProcessorTypeB」には「source」、「successDestination」および「failureDestination」プロパティを設定する必要があります。この例では、「dataProcessorTypeA」、「dataProcessorTypeB」、および「dataProcessorTypeZ」がプログラム内のクラスになります。

過去にプロパティー・ファイルを使用して単純な「property=value」タイプの構成を行ったことがありますが、このタイプの構成を実現する方法や、Google で類似の例を探すためにどの単語を使用すればよいかわかりません。達成しようとしています。また、将来新しいモジュールが追加される可能性があるため、多くのロジックをプログラムにハードコーディングしてプロパティ ファイルを読み取ることも避けたいと考えています。これは、getter と setter を使用して JavaBeans を構成する方法と似ていると思います。

私が達成したいのは、ユーザーがlog4jプロパティファイルで次のように設定することにより、複数のアペンダーを使用するようにApache log4jを構成できる方法に似ています...

log4j.appender.ca=org.apache.log4j.ConsoleAppender
log4j.appender.ca.layout=org.apache.log4j.PatternLayout
log4j.appender.rfa=org.apache.log4j.RollingFileAppender
log4j.appender.rfa.File=example.log

log4j の PropertyGetter.java ファイルを調べたところ、リフレクションとイントロスペクションを利用していることがわかりますが、何が起こっているのかを理解するための概念を十分に理解していません。

私が理解していないのは、「log4j.appender.ca」をオブジェクトとして作成し、org.apache.log4j.ConsoleAppender を使用するように構成する方法と、ログを処理するときに log4j が「log4j.appender.ca」を探す方法を知る方法です。メッセージ。私の質問は実際にはlog4jとは関係ありませんが、自分のプログラムで達成しようとしているタイプ構成のタイプを説明するために使用しています。

Apache Shiro も同様のメカニズムを提供しており、ユーザーはフレームワークの動作をカスタマイズできます。Shiro の ReflectionBuilder.java ファイルを調べたところ、Commons-BeanUtils ライブラリが使用されていることがわかりましたが、コード内で何が起こっているのかを理解するのに多少の理解がありません。

要約すると、私の質問は、log4j や Shiro などのフレームワークがこのタイプの構成の実行をどのように許可するか、または何を検索する必要があるかについてのポインタを教えてください。

4

2 に答える 2

3

ここを見て、 Propertiesクラスで使用します。

を使用Class.forName()すると、完全修飾名が指定されたクラスを見つけることができます。

于 2013-03-09T18:07:44.507 に答える
0

フレームワークは必要ありません: StringTokenizer(propertyname, ".") を使用すると、各トークンはネストされたマップの 1 つのレベルを表しますが、最後/葉が値です。

これはによって処理されます

Map<String,Map<String,..>>

したがって、「dataflow1」は第 1 レベル マップのキーであり、値は「source」と「destination」がレベル 2 にあり、リーフ/データ値は「source1」と「destination1」です。

于 2013-03-09T18:06:14.393 に答える