У меня такой сценарий:
Будет создана система тестирования языка 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 в действии (и другие источники), чтобы научиться.
Я хотел бы знать следующее: как я могу «внедрить» информацию о конфигурации в какой-то контроллер или фабрику, которые затем будут использовать ее для создания коллекции сервисов и предоставления им необходимой информации для создания читателей и писателей, которых они будут использовать для получения и отправки сообщений?
Судя по тому, что я читал до сих пор, Spring кажется довольно мощным WRT для внедрения зависимостей и «связывания компонентов», но я недостаточно знаю о том, что можно (и нельзя) сделать, и как это делать.
Я неравнодушен к тому, настроен ли Spring с помощью Java или XML. Я просто использовал XML, потому что его легко собрать, он позволяет структурировать данные и, кажется, используется повсюду. Если имеет смысл указать конфигурацию другим способом, просто дайте мне знать.
Как данная служба будет обрабатывать событие (то есть получать конкретное сообщение), чтобы, возможно, отправить сообщение «ответ» или предпринять какое-либо другое действие, - это тема, выходящая за рамки этого вопроса. Я изучаю, как это можно сделать - в основном при обработке на основе правил. Если у кого-то есть предложения, я с удовольствием их рассмотрю.




Создайте такой конфигурационный файл:
some.paremeter=cool
some.other.parameter=awesome
названный myconfig.properties. Убедитесь, что файл находится в вашем пути к классам, затем включите -Dspring.config.name=myconfig в ваши vm args; затем в xml вы можете использовать ${some.parameter} и т. д. В частности, размещение файла конфигурации в <project-root>/config/ будет работать.
Например, вот простой MongoClient из одного из моих проектов, который использует конфигурацию spring:
<!--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>
Зависит от файла свойств. Вы также можете использовать yaml или json - см. Документацию Конфигурация Spring. Я говорю, что вы можете использовать файлы свойств с открытым текстом для хранения статической информации, например строк слов, представляющих параметры. Как только Spring загрузит их, вы можете вставить эти параметры в XML, как захотите.
Просто любопытно: можно ли вообще использовать XML?
Я лично использую конфигурации Spring XML, а не конфигурации на основе аннотаций для большинства моих проектов (хотя аннотации - это новая школа). Да, один из основных способов настройки контекст приложения Spring - через XML.
Извините, наверное, я неправильно сформулировал свой вопрос. Вы упомянули файлы свойств в форме «стандартного» файла свойств Java или JSON или YAML для получения более структурированной информации о конфигурации. Мне интересно, можно ли в этом случае использовать XML? Итак, конфигурация Spring может быть XML или аннотированными классами Java, но могут ли эти данные конфигурации быть в отдельном файле (JSON, YAML, XML?), На который ссылается конфигурация Spring?
Я не уверен, что данные конфигурации могут быть сохранены в XML, но они определенно могут храниться в YAML и JSON. См. Ссылку на конфигурацию Spring, которую я вложил в свой первый комментарий в разделе «Загрузка YAML».
Это использует файл свойств для информации о переменной. Можно ли иметь структурированную информацию в файлах свойств? Я не думал, что сможете, поэтому использовал XML.