Внедрение кода во время выполнения - PullRequest
0 голосов
/ 19 июля 2011

SLF4J имеет приятный механизм, где реализация выбирается во время выполнения, в зависимости от того, что доступно в classpath .Я хотел бы использовать такую ​​функцию в нескольких проектах, например, чтобы выбрать коммуникационный уровень или выбрать фиктивную реализацию.

Я посмотрел на источник slf4j, чтобы увидеть, как это делается, и я мог просто написать что-то подобное.Прежде чем начать, я хотел бы знать, существует ли какая-либо легковесная FOSS библиотека для такого рода инъекций.

Ответы [ 4 ]

2 голосов
/ 19 июля 2011

Если вам не нужны особые возможности конфигурации, предоставляемые Pico или Guice, вы можете получить то, что вам нужно, из java.util.ServiceLoader.

По сути, все, что вам нужно сделать, это упаковать реализацию службы в файл JAR, включить текстовый файл со списком всех классов реализации в "META-INF / services /" и все, что вам нужно.

1 голос
/ 21 июля 2011

Посмотрели ли вы на Weld, CDI является частью спецификации EE6, но реализация Weld также поддерживает работу в среде Java SE.Это именно то, что вы ищете, вот ссылка на соответствующую документацию:

http://seamframework.org/Weld одна maven-зависимость для вашего приложения SE.
http://docs.jboss.org/weld/reference/1.1.0.Final/en-US/html/environments.html#d0e5333 начальная загрузка Weldконтейнер в SE.

Методы-производители для изменения реализации во время выполнения:

http://docs.jboss.org/weld/reference/1.1.0.Final/en-US/html/producermethods.html

Плюс (на мой очень предвзятый взгляд) Сварка пород;)

0 голосов
/ 19 июля 2011

Механизм SLF4J заключается в том, что его API-jar компилируется с кодом, который ссылается на класс, который предоставляется только одним из его «реализационных» jar-файлов. Для этого не нужны никакие фреймворки или библиотеки. Просто напишите один модуль, который скомпилирован с классом, не входящим в этот модуль. Затем ваши модули «реализации» предоставляют этот класс при включении в проект.

Редактировать: О, и это в основном OSGi, написанный маленьким (очень, очень маленький). Если вы собираетесь использовать подобные вещи в больших масштабах, посмотрите на контейнер OSGi или Eclipse Virgo.

0 голосов
/ 19 июля 2011

Каждый Java-программист должен знать, как использовать Spring .

...