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, ".") 然后每个标记代表嵌套映射的一个级别,除了最后/叶是值。

这是由

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

所以“dataflow1”是第一级地图中的一个键,在第2级有值“源”和“目标”,然后是“源1”和“目标1”的叶/数据值

于 2013-03-09T18:06:14.393 回答