NextLib Context
Полное архитектурное руководство по NextLibContext: bootstrap, lifecycle, сервисы, интеграция и границы ответственности.
NextLib Context
NextLibContext — центральный runtime-контейнер NextLib. В практическом смысле это точка, где инфраструктура плагина собирается в единый управляемый объект.
1. Почему это важно
Без единого контекста код быстро деградирует:
- сервисы создаются в разных местах;
- нет единого lifecycle;
- reload/metrics/i18n живут «каждый сам по себе»;
- сложнее тестировать и сопровождать.
NextLibContext устраняет этот хаос.
2. Что делает bootstrap(plugin)
При вызове:
NextLibContext context = NextLibContext.bootstrap(this);
создаются и поднимаются:
ReloadManagerMetricsRegistryHealthRegistryMessageBus(InMemoryMessageBus)FileTranslationStoreI18nServiceStructuredLogger- fallback locale
i18nдиректория
Также регистрируются базовые health checks:
- plugin enabled;
- наличие default locale bundle.
3. Доступные сервисы
context.reload()context.metrics()context.health()context.bus()context.translations()context.i18n()context.logger()context.fallbackLocale()context.i18nDirectory()
4. Практический каркас внедрения
public final class MyPlugin extends JavaPlugin {
private NextLibContext context;
private DatabaseManager databaseManager;
@Override
public void onEnable() {
context = NextLibContext.bootstrap(this);
context.logger().info("plugin_start", Map.of(
"name", getName(),
"version", getDescription().getVersion()
));
bootstrapDatabase();
bootstrapReloads();
bootstrapHealth();
}
@Override
public void onDisable() {
if (databaseManager != null) {
databaseManager.close();
}
}
}
5. Lifecycle-подход
На onEnable
- bootstrap context;
- поднять внешние сервисы (БД, gui manager, кэши);
- зарегистрировать reloadable/health metrics.
На onDisable
- закрыть внешние ресурсы;
- зафиксировать финальные метрики/логи при необходимости.
6. Как распределять ответственность
NextLibContext — это инфраструктура, не домен.
Правильное использование:
- сервисы домена получают context (или нужные интерфейсы) через конструктор;
- бизнес-правила не пишутся внутри bootstrap;
- bootstrap только собирает граф зависимостей.
7. Интеграция с Reload API
context.reload().register(new Reloadable() {
@Override
public String id() { return "i18n.translations"; }
@Override
public void reload() {
context.translations().reload();
}
});
Эта схема делает перезагрузку системной и прозрачной.
8. Интеграция с Observability
context.metrics().increment("plugin.enable");
context.health().register("database.main", () -> {
try {
databaseManager.getDefault().withConnection(connection -> null);
return HealthStatus.up("db ok");
} catch (Exception ex) {
return HealthStatus.down(ex.getMessage());
}
});
9. Интеграция с Messaging
context.bus().publish("plugin.started", new PluginStartedEvent(getName()));
Это помогает decouple модули без прямых зависимостей.
10. Типичные ошибки
- вызывать
bootstrapнесколько раз; - хранить
NextLibContextв статике без контроля lifecycle; - использовать context как «бог-объект» и тащить доменную логику внутрь него.
11. Антипаттерны
- сервисы сами создают себе context;
- context создаётся лениво в командах/листенерах;
- смешивание конфигурации, домена и инфраструктуры в одном классе.
12. Рекомендованный шаблон проекта
Bootstrap/ main plugin class — создаёт context и сервисы.Infrastructureслой — db/gui/config modules.Applicationслой — use cases.Domainслой — модели и правила.
Context живёт на границе bootstrap/infrastructure.
13. FAQ
Можно ли заменить NextLibContext своим DI?
Да. Вы можете использовать собственный контейнер, а NextLibContext держать как один из инфраструктурных компонентов.
Нужен ли context для маленького плагина?
Даже для маленького плагина он полезен: снижает хаос и упрощает рост.
Нужно ли сериализовать context?
Нет. Это runtime-объект, не persistence-сущность.
14. Чеклист корректного использования
- bootstrap только в
onEnable; - один экземпляр context на плагин;
- ресурсы корректно закрываются на
onDisable; - reload/metrics/health зарегистрированы через context.
С такой дисциплиной NextLibContext становится надежным фундаментом архитектуры.