1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/beyondts-mplug-project

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README_zh.md

mplug-project

Введение


mplug — это основанный на аннотациях и подходящий для SpringBoot плагин-фреймворк. Его цель — решить проблему, когда логика одного проекта может по-разному обрабатываться в разных средах. Этот фреймворк поддерживает два способа определения точек расширения:

  1. Использование аннотации @Extension: добавьте аннотацию @Extension к методу, который нужно расширить, и определите ID точки расширения. Метод станет точкой расширения. Если не вставить плагин, обрабатывающий эту точку расширения, метод будет использовать свою исходную логику. После вставки плагина, реализующего этот метод, его логика заменит исходную. Плагины могут иметь свои собственные точки расширения, определённые с помощью аннотации @Extension.
  2. Определение точек расширения через файл конфигурации extensions: в этом случае ID точки расширения должен быть равен сигнатуре (Signature) метода. Преимущество этого подхода в том, что для добавления точки расширения не нужно изменять исходный код, она добавляется динамически. Однако эффективность выполнения всех методов, которые сканируются, немного снизится (потребуется проверка наличия указанной точки расширения). Чтобы поддерживать плагины в этом подходе, необходимо определить ConfigurableExtensionHandler в верхнем плагине и зарегистрировать его как экземпляр Spring (см. раздел «Использование» 5).
  • Примечание 1: mplug поддерживает горячее подключение и отключение плагинов, но после отключения плагин остаётся загруженным своим ClassLoader, который просто закрыт. Поэтому даже после горячего отключения плагин нельзя переместить.
  • Примечание 2: mplug написан на JDK1.8 и не тестировался на других версиях.
  • Примечание 3: mplug использует SpringBoot версии 2.1.0 и не тестировался на других версиях SpringBoot.
  • Примечание 4: из-за особенностей Spring-AOP все методы, которые должны стать точками расширения, должны управляться Spring, то есть при вызове они должны использоваться способом Spring, например, через Autowired или BeanFactory.getBean для получения экземпляра класса и последующего вызова.
Плагин:

Плагин может содержать несколько jar-файлов, но только один из них может быть основным. Основной jar-файл должен содержать хотя бы один класс плагина и файл plugin.info в каталоге META-INF. Если класс является классом плагина, он должен содержать как минимум один метод с аннотацией @Plugin. Формат основного jar-файла должен быть name-version.jar. Класс плагина может содержать несколько аннотаций @Plugin, но эти методы должны предоставлять связанные функции. Один метод с аннотацией @Plugin соответствует одной точке расширения с аннотацией @Extension. Класс плагина должен иметь конструктор без параметров или быть управляемым Spring.

Точка расширения:

Точка расширения — это любой метод в классе, исходная реализация которого становится реализацией по умолчанию для этой точки расширения. Когда фреймворк обнаруживает плагин для этой точки расширения, он автоматически заменяет реализацию по умолчанию реализацией плагина.

Архитектура программного обеспечения


Проект mplug содержит три подмодуля:

  1. Модуль mplug реализует плагин-фреймворк и при использовании требует только включения jar-пакета модуля.
  2. Модуль extension-example служит примером точки расширения.
  3. Модуль plugin-example демонстрирует реализацию плагина.
  4. Модуль another-lib содержит пример точки расширения в тестовом jar-пакете.

Структура каталогов плагинов:

plugins — каталог плагинов, заданный системной переменной plugin.dir.

config — каталог, содержащий файлы конфигурации для использования фреймворком.

extensions — файлы, содержащие записи всех настроенных точек расширения. Одна строка — одна точка расширения.

plugins — файлы, записывающие все установленные плагины. Одна строка — один плагин.

jars — каталог для размещения всех jar-пакетов плагинов.

Основной jar-пакет плагина — основной jar-пакет каждого плагина.

lib — если плагину требуется поддержка сторонних jar-пакетов, поместите все сторонние jar-файлы в этот каталог. Классы в этом каталоге, даже если они содержат аннотацию @Plugin, не будут распознаны.

Инструкция по установке


  1. Скачайте исходный код mplug-проекта и скомпилируйте его, чтобы получить mplug-version.jar.
  2. Добавьте mplug-version.jar в основной проект.
  3. Создайте каталог плагинов с именем, заданным системной переменной plugins.dir, и создайте в нём каталоги config и jars. В каталоге config храните файлы конфигурации плагинов и точки расширения (для второго способа определения точки расширения). В каталоге jars храните все плагины, каждый плагин должен находиться в своём собственном подкаталоге, например, plugin-example-1.0.0.jar находится в подкаталоге plugin-example-1.0.0. Если плагину требуются сторонние jar-пакеты, поместите их в каталог lib в подкаталоге плагина, например, если plugin-example-1.0.0.jar зависит от commons-io.jar, поместите commons-io.jar в подкаталог plugin-example-1.0.0/lib.
  4. Определите плагины в файле plugins, по одному плагину в строке. Например, если вы используете плагин plugin-example-1.0.0.jar, добавьте строку plugin-example-1.0.0 в файл. Только плагины, определённые в файле plugins, будут установлены в основном проекте, а не установленные плагины не будут работать в основном проекте, даже если они находятся в каталоге jars.
  5. Если вы используете второй способ автоматического добавления точек расширения, определите каждую точку расширения в файле extensions, по одной точке расширения на строку.
  6. При разработке кода плагина каждый метод точки расширения должен соответствовать входным и выходным параметрам точки расширения, а также иметь аннотацию @Plugin с указанием идентификатора точки расширения через параметр extension.
    • Примечание: класс, содержащий аннотацию @Plugin, должен быть создан Spring или иметь конструктор по умолчанию. Spring будет отдавать предпочтение получению экземпляров этого класса из SpringContext.
  7. В META-INF каталога плагина (каталог ресурсов) добавьте файл plugin.info для описания информации о текущем плагине. Плагин поддерживает четыре свойства: artifactId (артефакт плагина), version (версия), name (отображаемое имя) и description (описание), по одному свойству в каждой строке. Пример:
    ## This file describe a plugin, 4 properties could be used: artifactId, version, name, description.
    artifactId:plugin-example
    version:1.0.0
    name:Тестовый плагин
    description:Это описание плагина
    Где # обозначает комментарий.

Использование


После установки:

  1. В классе SpringBoot Entry добавьте аннотацию @EnableAspectJAutoProxy, чтобы SpringBoot автоматически сканировал классы с аннотацией @Aspect.
  2. В файле конфигурации SpringBoot (application .properties или другой файл, автоматически загружаемый Spring) добавьте свойство bascPackagesToScan, которое указывает пакеты, которые Spring должен сканировать автоматически. Это значение может включать несколько пакетов, разделённых запятыми. Используйте этот метод для того, чтобы Spring обнаружил управление плагинами и реализацию расширений, что является лучшим методом для текущей версии. По умолчанию будет запущен RestController, предоставляющий функции горячего подключения и отключения плагинов и функцию запроса информации о плагинах:
    • Отключение плагина: delete /plugins/uninstall/имя плагина
    • Подключение плагина: put /plugins/install/имя плагина
    • Просмотр текущих подключённых плагинов: get /plugins/get/all
    • Просмотр информации о конкретном плагине: get /plugins/get/имя плагина
  3. Вы также можете использовать @Bean для определения AnnotatedExtensionHandler и ConfigurableExtensionHandler, но в этом случае вам нужно вручную создать PluginManager и внедрить его в указанные выше Handler. Не рекомендуется использовать этот метод.
  4. Для использования ConfigurableExtensionHandler для автоматического добавления точек расширения необходимо создать класс, наследующийся от этого Handler, и добавить аннотацию @Aspect к классу, а также аннотацию @Around к методу handle, чтобы указать, какие базовые пакеты разрешены для автоматического добавления точек расширения. Пример:
    @Aspect
    @Component
    public class SomeConfigurableExtensionHandler extends ConfigurableExtensionHandler {
        public SomeConfigurableExtensionHandler() throws IOException {
            super();
        }
    

@Around("within(net.beyondts.example.mplug.extension..*)") public Object handle(ProceedingJoinPoint joinPoint) throws Throwable { return super.handle(joinPoint); }


* **Примечание:** аннотация @Component используется только для того, чтобы Spring автоматически запускал Handler. Все методы подкласса должны просто вызывать соответствующий метод суперкласса напрямую.

5. В проекте плагина можно использовать аннотацию @Component (или любую другую, содержащую аннотацию @Component), чтобы передать класс в управление Spring, и одновременно использовать @Autowired для внедрения объектов из других проектов плагинов, управляемых Spring.
6. Если вы хотите использовать методы Bean, управляемые Spring в основном проекте, в проекте плагина, используйте класс инструментов SpringBeansInvocation для вызова.
7. methodB вызывается methodA, оба метода находятся в ClassX. Если methodB является точкой расширения, то плагин не сможет работать нормально при обычном использовании this.methodB, потому что объект, на который указывает this, не является прокси-объектом, а самим ClassX. Чтобы решить эту проблему, можно позволить ClassX наследовать Self и использовать метод invokeSelf класса Self для вызова methodB в methodA или использовать метод BeanFactory.getBean(ClassX).methodB для вызова methodB.
8. У одной точки расширения может быть несколько реализаций плагинов. Плагины выбирают и сравнивают с помощью аннотаций Plugin choose и compare, чтобы найти подходящий метод.
   * Параметр choose: атрибут или метод (должен заканчиваться на ()) некоторого метода (a:) или некоторого компонента Spring (s:), может иметь несколько уровней.
   * Параметр compare: константа, результат выбора сравнивается с этим значением параметра с использованием равенства строк. Если они равны, текущий метод плагина будет использоваться.
   * Если есть несколько методов плагина, которые могут соответствовать, будет использоваться только первый соответствующий метод.
9. Каждый плагин может выполнять некоторые операторы SQL во время установки и удаления, чтобы записать необходимую информацию в базу данных. Если вам нужно использовать этот эффект, добавьте install.sql (выполняется при установке) и uninstall.sql (выполняется при удалении) в META-INF плагина.
   * **Примечание**: каждый файл sql может содержать несколько операторов sql, но каждый оператор sql должен заканчиваться символом «;».

#### Список задач
~~* Протестировать, есть ли пробелы между параметрами Signature~~  
~~* Настроить путь базового пакета сканирования Spring~~  
~~* Плагин плагина: пока не рассматривается~~  
~~* По умолчанию плагин, аналогичный эффекту покрытия конфигурационного файла Spring~~  
~~* Увеличить пакет аспекта конфигурации через конфигурацию: невозможно реализовать~~  
* Типы точек расширения


#### Участие в разработке
---

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

mplug — это плагин-фреймворк, основанный на методе аннотаций и подходящий для SpringBoot. Его цель — решить проблему, когда логика проекта может требовать разной обработки в разных сценариях. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/beyondts-mplug-project.git
git@api.gitlife.ru:oschina-mirror/beyondts-mplug-project.git
oschina-mirror
beyondts-mplug-project
beyondts-mplug-project
master