# Spring API

Spring API allows 3rd party plugins to re-use, integrate with, or extend existing Spring Framework support in IntelliJ IDEA Ultimate.

Please see [Spring Framework Support](https://www.jetbrains.com/lp/intellij-frameworks/) for general feature overview. A popular plugin using Spring API is [hybris integration](https://plugins.jetbrains.com/plugin/7525-hybris-integration). To develop plugins, you will need to use _IntelliJ IDEA Ultimate Edition_ version 13.1 or higher. ## Setting up Project Setup [Gradle](creating_plugin_project.md) to target IntelliJ IDEA Ultimate, then [add dependency](plugin_dependencies.md) to bundled Spring plugin with ID `com.intellij.spring`. Please use only Spring-related functionality exposed in spring-api.jar (sources are provided in \$IDEA_HOME\$/lib/src/src_spring-boot-openapi.zip) in your plugin. Using any other "internal" (implementation) classes from Spring plugin itself (spring.jar) is _not_ supported. ### plugin.xml Add `com.intellij.spring` to your [plugin.xml](plugin_configuration_file.md) to require "Spring Support" plugin to be activated. All available extension points are provided under `com.intellij.spring` prefix. Note that the "Spring Support" plugin itself has dependencies on a few other plugins which need to be enabled in your sandbox (see notifications on startup). ## Main Concepts A Spring facet can be attached to a Module. Nearly all Spring functionality requires an existing and correctly setup Spring facet. Spring facets usually contain one more user-configured or automatically provided filesets, which group a set of Spring related configuration files (XML, Code, .properties, or other configuration files). A fileset usually corresponds to an actual application context configuration at runtime. Hierarchies can be modeled by depending on another fileset (possibly from another module). As an API-user, you will usually prefer working with `SpringModel`, which is built on top of fileset(s). ## API Updates > 2017.3: `LocalXmlModel#setActiveProfiles` & `LocalAnnotationModel#setActiveProfiles` have been deprecated and will be removed in 2018.1. > {style="note"} > Starting with 2016.2, the internal representation of bean _type_ has been changed from `PsiClass` to `PsiType`, please note deprecations. > {style="note"} > Some core classes have been changed in 14(.1); please see "_Version 14(.1)_" notes for info on how to replace existing API-calls. > {style="note"} ## How Do I... > See [](spring_extension_point_list.md) for the complete list. > {style="note"} ### Spring Setup To check availability of Spring/Spring Facet etc. see `com.intellij.spring.model.utils.SpringCommonUtils`. _2016.2_ See `com.intellij.spring.SpringLibraryUtil` to obtain information about the exact version of Spring in use. ### Spring Model #### Obtain Spring Model by a File, PSI Element, ... See `SpringManager#getSpringModel(s)...` and `com.intellij.spring.model.utils.SpringModelUtils`. #### Contribute Implicit Model See `com.intellij.spring.SpringModelProvider` to provide implicit filesets (e.g. provided by another framework in a specific configuration file). _Version 15_ See `com.intellij.spring.facet.SpringAutodetectedFileSet` for a convenient base class. Please note that autodetected filesets cannot be edited/modified by users in Spring facet. #### Customize Implicit Models Configuration _2017.1_ See `com.intellij.spring.facet.SpringFileSetEditorCustomization` to customize presentation and/or add extra settings/actions for specific autodetected filesets. #### Contribute Implicit Beans See `com.intellij.spring.model.jam.CustomComponentsDiscoverer` or `com.intellij.spring.model.SpringImplicitBeansProviderBase` to provide implicit (framework-specific) beans (e.g. "servletContext" by Spring MVC). _Version 15_ `CustomComponentsDiscoverer` has been split into `com.intellij.spring.model.custom.CustomLocalComponentsDiscoverer` and `com.intellij.spring.model.custom.CustomModuleComponentsDiscoverer` respectively. #### Contribute Custom Bean Scope _Version 14_ See `com.intellij.spring.model.scope.SpringCustomBeanScope` to provide custom (e.g. framework specific) bean scopes. #### Obtain/Create Spring Profiles _Version 14.1_ `com.intellij.spring.profiles.SpringProfilesFactory` ### Beans #### Search for Bean by Name `com.intellij.spring.CommonSpringModel#findBeanByName` _Version 14_: `com.intellij.spring.model.utils.SpringModelSearchers#findBean` #### Search for Beans by Type Choose one of `com.intellij.spring.CommonSpringModel#findBeansByPsiClassXXX` variants (please note deprecated methods). _Version 14_: `com.intellij.spring.model.utils.SpringModelSearchers#findBeans` _Version 16_: note deprecation of `SpringModelSearchParameters.BeanClass#withInheritors(GlobalSearchScope)` #### Check If a Bean with Given Name/Type Exists _Version 14_: `com.intellij.spring.model.utils.SpringModelSearchers#doesBeanExist` (please note deprecated methods) #### Mark Bean as Infrastructure Bean _Version 14_: implement `SpringInfrastructureBean`, such beans obtain a special icon and can be filtered in various places in UI. ### XML Configuration All support for XML-based Spring configuration files is provided via [DOM-API](xml_dom_api.md). #### Add Support for Additional Spring Namespace See , registered namespace-key must match the one registered with your DOM elements via `@Namespace`. Register available elements via standard `DomExtender` EP or `com.intellij.spring.dom.SpringCustomNamespaces#registerExtensions` (Version 14). Please pay attention to `getModelVersion` and `getStubVersion` (see Javadoc). #### Add Reference to Spring Bean in DOM Element Use the following template: ```java @Convert(SpringBeanResolveConverter.class) @RequiredBeanType("fqn.to.required.class") // optional GenericAttributeValue getMyAttributeName(); ``` ### Code Configuration #### Add Reference to Spring Bean in JAM Element _Version 14_ ```java JamStringAttributeMeta.Single ATTRIBUTE_META = JamAttributeMeta.singleString("attributeName", new SpringBeanReferenceJamConverter("fqn.to.required.class")); ``` #### @AliasFor _Version 16_ See `com.intellij.spring.model.aliasFor.SpringAliasForUtils` to obtain corresponding `@AliasFor` JAM. ### spring.factories _Version 15_ See `com.intellij.spring.spi.SpringSpiManager`. ### IDE Features #### Add Inspections to Spring Validator Add additional inspections (e.g. for custom namespace) to Spring Validator (*Settings|Compiler|Validation*) via `com.intellij.spring.SpringInspectionsRegistry$Contributor` in . #### Add Additional Files to Spring Validator _Version 14.1_ Additional files to be processed by inspections registered with Spring Validator (e.g. specific .properties configuration files) can be registered via `com.intellij.spring.SpringInspectionsRegistry$AdditionalFilesContributor` #### Configure Spring Support for Other Frameworks Use `com.intellij.spring.facet.SpringConfigurator` to provide "automatic" configuration when Spring facet is added via framework wizard. #### UI/Presentation Please do not reference bean icons from `SpringApiIcons` directly, but use `SpringPresentationProvider` to re-use unified icon/bean name. See `SpringBeansPsiElementCellRenderer` for popup/list renderer. ## Spring Boot _2018.1_ Spring Boot API allows extending/accessing Spring Boot specific support in the IDE. > While we try to maintain compatibility, please be prepared for a less strict policy. > {style="warning"} ### Setting Up [Add dependency](plugin_dependencies.md) to bundled Spring Boot plugin with ID `com.intellij.spring.boot`. Sources for Spring Boot API are available in \$IDEA_HOME\$/lib/src/src_spring-boot-openapi.zip. ### Update plugin.xml Add `com.intellij.spring.boot` to your [plugin.xml](plugin_configuration_file.md) to require "Spring Boot" plugin to be activated. All available extension points are provided under `com.intellij.spring.boot` prefix. ### Spring Boot Library Use `com.intellij.spring.boot.library.SpringBootLibraryUtil` to query version and availability of common additional libraries. ### Custom Configuration Files Format `com.intellij.spring.boot.model.SpringBootModelConfigFileContributor` allows adding support for custom config file formats. ### Auto-Configuration Support Existing `Condition` implementations can be simulated at design time in IDE via `com.intellij.spring.boot.model.autoconfigure.conditions.ConditionalContributor`. Custom `@ConditionalOn...` annotations implementing `com.intellij.spring.boot.model.autoconfigure.conditions.jam.ConditionalOnJamElement` will be added into evaluation automatically. ### Spring Initializr `com.intellij.spring.boot.initializr.SpringInitializrModuleBuilderPostTask` allows performing custom setup steps after creation of module (e.g. setup integration with build system). ### Endpoint Tab Use to add custom actuator endpoint tabs. Any settings should be exposed in "Spring Boot" settings tab via .