【问题标题】:How do I "inject" structured configuration information with Spring?如何使用 Spring“注入”结构化配置信息?
【发布时间】:2018-09-24 19:54:51
【问题描述】:

我有以下场景:

将会有一个 Java 语言测试平台系统,由多个“服务”组成,这些“服务”通过相互传递消息进行协作。服务实现旨在是通用的,即其中不包含特定的“业务逻辑”。就测试平台而言,能够创建各种服务集合并在外部配置(如果可能)非常重要。

服务本身不知道任何其他服务的存在。每个服务只订阅它期望接收信息的主题,并发布它向任何等待的订阅者发送信息的主题。通过仔细配置,就可以模拟数据流图。

该计划是通过提供描述设置订阅者(阅读者)和发布者(作者)所需信息的配置信息来配置给定的服务实例。配置信息可能包括其他与发布/订阅无关的属性。

下面是一个可能的例子:

注意:选择 XML 作为示例只是因为它很容易阅读并允许结构化数据。

<service>
    <name>Service A</name>
    <service-id>service ID</service-id>

    <publish>
        <per-second>5</per-second>
        <topic>
            <name>Topic 1</name>
            <class>org.xyz.Topic1</class>
            <!-- override 5/sec rate -->
            <per-second>10</per-second>
        </topic>
        <topic>
            <name>Topic 2</name>
            <class>org.xyz.Topic2</class>
        </topic>
    </publish>

    <subscribe>
        <topic>
            <name>Topic 3</name>
            <class>org.xyz.Topic3</class>
        </topic>
    </subscribe>
</service>

<service>
    <name>Service B</name>
    <service-id>service ID</service-id>

    <publish>
        <per-second>30</per-second>
        <topic>
            <name>Topic 3</name>
            <class>org.xyz.Topic3</class>
        </topic>
    </publish>

    <subscribe>
        <topic>
            <name>Topic 2</name>
            <class>org.xyz.Topic2</class>
        </topic>
    </subscribe>
</service>

...

我想使用 Spring 框架来帮助配置这些服务。 注意:我对 Spring 很陌生,目前正在阅读 Spring in Action(和其他资源)以自学。

我想知道的是:我如何将配置信息“注入”到某种控制器或工厂,然后使用它来创建服务集合并为它们提供必要的信息来创建阅读器和他们将用来接收和发送消息的编写器?

从我目前所读到的内容来看,Spring 对于依赖注入和“bean 布线”来说似乎是非常强大的 WRT,但我对可以(和不能)做什么以及如何去做还不够了解.

我不偏爱 Spring 是由 Java 还是 XML 配置的。我只是使用 XML,因为它易于组合,允许数据结构化,并且似乎可以在任何地方使用。如果以不同的方式指定配置更有意义,请告诉我。

给定服务如何处理事件(即接收特定消息)以可能发送消息“响应”或采取其他行动,这是本问题范围之外的主题。我正在研究如何做到这一点 - 主要是基于规则的处理。如果有人有建议,我很乐意看看。

【问题讨论】:

    标签: java spring dependency-injection config


    【解决方案1】:

    制作一个这样的配置文件:

    some.paremeter=cool
    some.other.parameter=awesome
    

    命名为myconfig.properties。确保文件在你的类路径中,然后在你的虚拟机参数中包含-Dspring.config.name=myconfig;然后在xml中你可以使用${some.parameter}等。特别是,将配置文件放在&lt;project-root&gt;/config/中会起作用。

    例如,这是我的一个项目中使用 spring 配置的简单 MongoClient:

    <!--Mongo-->
    <bean id="mongoClient" class="com.mongodb.MongoClient">
        <constructor-arg>
            <bean class="com.mongodb.MongoClientURI">
                <constructor-arg type="java.lang.String"
                                 value="mongodb://${mongo.db.user}:${mongo.db.password}@${mongo.db.host}:${mongo.db.port}/${mongo.db.database}"/>
            </bean>
        </constructor-arg>
    </bean>
    

    【讨论】:

    • 这使用属性文件来存储变量信息。是否可以在属性文件中包含结构化信息?我不认为你可以,这就是我使用 XML 的原因。
    • 取决于属性文件。您也可以使用 yaml 或 json - 请参阅 Spring Configuration 文档。我是说您可以使用纯文本属性文件来保存静态信息,例如表示参数的字符串。一旦 spring 加载它们,你就可以根据需要将这些参数注入到 XML 中。
    • 只是好奇:XML 甚至是一种选择吗?
    • 我个人在我的大多数项目中使用 spring XML 配置,而不是基于注释的配置(即使注释是新派。)是的,配置 spring application context 的主要方法之一是通过 XML。
    • 抱歉,我的问题肯定措辞不正确。您以“标准”Java 属性文件或 JSON 或 YAML 的形式提到了属性文件,以获取更多结构化的配置信息。我想知道在这种情况下 XML 是否是一个选项?因此,Spring 配置可以是 XML 或带注释的 Java 类,但此配置数据是否可以在 Spring 配置引用的单独文件(JSON、YAML、XML?)中?
    猜你喜欢
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 2019-01-23
    相关资源
    最近更新 更多