[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-jira-kak-rabotaet-spring-v-plaginakh-jira-data-center":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":19,"progress":20,"seo":21},922,"kak-rabotaet-spring-v-plaginakh-jira-data-center",27,"jira","Jira","📋","Как работает Spring в плагинах Jira Data Center?","Плагины Jira DC используют Atlassian Spring Scanner — обёртку над Spring Framework, адаптированную для работы в OSGi-среде. Это не стандартный Spring Boot: здесь нет автоконфигурации, component-scan по конвенциям, и аннотации отличаются.\n\n### Ключевые аннотации\n\n```java\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport com.atlassian.plugin.spring.scanner.annotation.imports.ComponentImport;\nimport com.atlassian.plugin.spring.scanner.annotation.export.ExportAsService;\n\n\u002F\u002F @Named — аналог @Component\u002F@Service в Spring Boot\n\u002F\u002F @Inject — аналог @Autowired\n\u002F\u002F @ComponentImport — импорт сервиса из Jira (host application)\n\u002F\u002F @ExportAsService — публикация компонента как OSGi-сервиса\n```\n\n### Пример компонента плагина\n\n```java\n@Named\npublic class IssueHelperService {\n\n    private final IssueManager issueManager;\n    private final UserManager userManager;\n    private final JiraAuthenticationContext authContext;\n\n    @Inject\n    public IssueHelperService(\n            @ComponentImport IssueManager issueManager,\n            @ComponentImport UserManager userManager,\n            @ComponentImport JiraAuthenticationContext authContext) {\n        this.issueManager = issueManager;\n        this.userManager = userManager;\n        this.authContext = authContext;\n    }\n\n    public MutableIssue getIssue(String key) {\n        ApplicationUser user = authContext.getLoggedInUser();\n        return issueManager.getIssueByCurrentKey(key);\n    }\n}\n```\n\n### Spring Scanner 2.x vs 1.x\n\n| Аспект | Scanner 1.x | Scanner 2.x |\n|---|---|---|\n| Сканирование | Runtime (медленно) | Compile-time (быстро) |\n| Конфигурация | XML + аннотации | Преимущественно аннотации |\n| Производительность | Медленный старт плагина | Быстрый старт |\n| component-import в XML | Обязательно | Не нужно (через `@ComponentImport`) |\n\n### Отличия от стандартного Spring Boot\n\n| Spring Boot | Jira Plugin (Spring Scanner) |\n|---|---|\n| `@Service`, `@Component` | `@Named` (javax.inject) |\n| `@Autowired` | `@Inject` (javax.inject) |\n| Component scan по пакетам | Spring Scanner — compile-time генерация |\n| `@Configuration` + `@Bean` | Ограничено, чаще — XML или `@Named` |\n| `@Value(\"${prop}\")` | SAL PluginSettings или System.getProperty() |\n| ApplicationContext | OSGi BundleContext |\n| Spring Data JPA | Active Objects |\n\n### Экспорт сервиса для других плагинов\n\n```java\n@ExportAsService({NotificationService.class})\n@Named\npublic class NotificationServiceImpl implements NotificationService {\n\n    @Inject\n    public NotificationServiceImpl(@ComponentImport MailServerManager mailManager) {\n        \u002F\u002F ...\n    }\n\n    @Override\n    public void notify(String userKey, String message) {\n        \u002F\u002F реализация\n    }\n}\n\n\u002F\u002F Другой плагин может импортировать этот сервис:\n@Named\npublic class ConsumerComponent {\n\n    @Inject\n    public ConsumerComponent(\n            @ComponentImport NotificationService notificationService) {\n        \u002F\u002F использование сервиса из другого плагина\n    }\n}\n```\n\n### Частые ошибки\n\n- Использование `@Autowired` вместо `@Inject` — может не работать в OSGi-контексте\n- Использование `@Service`\u002F`@Component` вместо `@Named` — Spring Scanner их не обнаруживает\n- Забыть `@ComponentImport` при инжекции Jira-сервиса — получите NoSuchBeanDefinitionException\n- Циклические зависимости между компонентами — Spring Scanner не всегда корректно их разрешает\n- Попытка использовать Spring Boot стартеры — они несовместимы с OSGi\n\n### Как используется в 2026\n\n- Spring Scanner 2.x — стандарт для всех новых плагинов\n- Compile-time сканирование стало нормой — runtime-сканирование считается legacy\n- Многие разработчики приходят из Spring Boot и допускают типичные ошибки — знание различий критично\n- Atlassian не планирует переход на Spring Boot для DC-плагинов — OSGi-модель остаётся\n\n> **На собеседовании:** главное — чётко показать отличия от стандартного Spring Boot. `@Named` вместо `@Service`, `@Inject` вместо `@Autowired`, `@ComponentImport` только для сервисов из Jira\u002Fдругих плагинов. Всегда используйте constructor injection. Это одна из тем, где ошибки допускают даже опытные Spring-разработчики.","","middle",[15,16,17,18,7],"osgi","dependency-injection","spring-boot","jira-plugin",[],null,{"title":22,"description":23,"ogTitle":24,"ogDescription":25,"keywords":26,"schemaAnswer":35,"featuredSnippetReady":36},"Как работает Spring в плагинах Jira Data Center — Gymterview","Atlassian Spring Scanner: @Named, @Inject, @ComponentImport, @ExportAsService. Отличия от Spring Boot, Scanner 2.x vs 1.x. Типичные ошибки.","Spring в Jira DC плагинах: Scanner, @Named, @ComponentImport — Gymterview","Как работает Atlassian Spring Scanner в OSGi-плагинах: аннотации, отличия от Spring Boot, экспорт\u002Fимпорт сервисов.",[27,28,29,30,31,32,33,34],"Spring Scanner","@Named","@Inject","@ComponentImport","@ExportAsService","OSGi","Jira DC plugin","Spring Boot отличия","Плагины Jira DC используют Atlassian Spring Scanner — обёртку над Spring для OSGi. Аннотации: @Named (вместо @Service\u002F@Component), @Inject (вместо @Autowired), @ComponentImport (импорт Jira-сервисов), @ExportAsService (публикация для других плагинов). Scanner 2.x использует compile-time сканирование (быстрый старт), 1.x — runtime (устарел). Spring Boot стартеры несовместимы с OSGi.",true]