org.projectforge.plugins.core.AbstractPlugin (ServiceLoader)IHKPlugin как реализацию org.projectforge.plugins.core.AbstractPlugin. Этот однострочный файл является механизмом, с помощью которого плагин IHK обнаруживается и загружается во время выполнения.org.projectforge.plugins.ihk.IHKPlugin
Этот файл находится по стандартному пути Java ServiceLoader META-INF/services/{полное-имя-интерфейса}. Когда сканер плагинов ProjectForge вызывает ServiceLoader.load(AbstractPlugin.class), JVM читает все такие файлы из classpath, создаёт экземпляры каждого перечисленного класса и вызывает initialize() для каждого экземпляра плагина.
PFPluginService (или эквивалентный сканер плагинов) вызывает ServiceLoader.load(AbstractPlugin.class).META-INF/services/org.projectforge.plugins.core.AbstractPlugin в каждом JAR-файле плагина или записи classpath.AbstractPlugin регистрирует метаданные плагина (ID, имя, описание).initialize(), где IHKPlugin выполняет регистрацию DAO, веб-компонентов, меню, прав и i18n.java.util.ServiceLoader, а не сканирование Spring @Component для обнаружения плагинов. Это позволяет загружать плагины из внешних JAR-файлов, помещённых в директорию плагинов, независимо от базовых пакетов сканирования компонентов Spring.IHKPlugin.IHKPlugin не является бином Spring, компоненты, которые он связывает (через WicketSupport.get()), управляются Spring. Этот гибридный подход сохраняет жизненный цикл плагина отдельным от жизненного цикла контекста Spring.org.projectforge.plugins.todo.ToDoPlugin (см. #287), плагин Memo имеет org.projectforge.plugins.memo.MemoPlugin и т.д.50d5d8926 wip: META-INF/services необходимы для плагинов (Service loader) 07b80966b wip: PFPluginService (PluginConfig) -> PluginInfo 45cad02e9 IHK-Плагин добавлен (заменит плагин "Ihk-Export")