java - 如何使用Java属性文件来定义对象并为对象设置属性?

标签 java properties configuration

我正在开发一个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 配置 JavaBean 的方式类似。

我想要实现的效果类似于用户通过在 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 文件,可以看到它利用了反射和内省(introspection),但是我对这些概念没有足够深入的理解,无法理解正在发生的事情。

我不明白的是如何将“log4j.appender.ca”创建为对象,配置为使用org.apache.log4j.ConsoleAppender,然后log4j如何知道寻找“log4j.appender.ca”处理日志消息时。我的问题与 log4j 并不真正相关,但我用它来说明我希望在自己的程序中实现的类型配置的类型。

Apache Shiro 还提供了类似的机制,允许用户自定义框架的运行方式。我查看了 Shiro 中的 ReflectionBuilder.java 文件,可以看到正在使用 Commons-BeanUtils 库,但我还是不太了解代码中发生的情况。

总而言之,我的问题是,任何人都可以让我更好地理解 log4j 和 Shiro 等框架如何允许执行此类配置,或者给我一些关于我应该搜索的内容的指示吗?

最佳答案

看看here ,并与 Properties 一起使用类。

使用Class.forName(),您可以找到一个具有完整限定名称的类。

关于java - 如何使用Java属性文件来定义对象并为对象设置属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15313957/

相关文章:

javascript - 如何对具有动态属性的数组进行排序?

java - 从套接字读取二进制数据

java - 如何在 Spring MVC 中添加日期字段

cocoa - 如何观察 NSObject 属性的变化

ios - 推送时数据未传递到 View Controller

java - Spring - 任务调度程序的问题

android - 检查 ScanResult 网络是否已配置(存在于 getConfiguredNetworks() 列表中)

configuration - SonarQube Visual Studio Bootstrapper 找不到程序集

java - 接收 Camel Twitter 消费者端点数据

java - Windows 端口的最大积压值