如何通过Spring“注入”结构化配置信息?

时间:2018-09-24 19:54:52

标签: java spring dependency-injection config

我有以下情况:

将有一个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,但是我对什么可以(也不能做)以及如何做的了解不多。

我不仅仅依赖于用Java还是XML配置Spring。我之所以使用XML是因为它易于组合,可以进行数据结构化,并且似乎可以在任何地方使用。如果以其他方式指定配置更有意义,请告诉我。

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

1 个答案:

答案 0 :(得分:0)

制作这样的配置文件:

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

名为myconfig.properties。确保文件在类路径中,然后在虚拟机参数中包含-Dspring.config.name=myconfig;然后可以在xml中使用${some.parameter}等。特别是,将配置文件放入<project-root>/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>