# Spring API
Spring API allows third party plugins to re-use, integrate with, or extend existing Spring Framework support in IntelliJ IDEA Ultimate.
Please see [Spring Framework Support](https://lp.jetbrains.com/intellij-idea-spring/) for a 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_.
## Setting up Project
Set up [Gradle](creating_plugin_project.md) to target [IntelliJ IDEA Ultimate](idea.md), then [add dependency](plugin_dependencies.md) to the 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 the Spring plugin itself (spring.jar) is _not_ supported.
### plugin.xml
Add `com.intellij.spring` to your [plugin.xml](plugin_configuration_file.md) to require the "Spring Support" plugin to be activated.
All available extension points are provided under the `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 correct 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 the availability of Spring/Spring Facet, 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 auto-detected 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 auto-detected 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 , the 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 the framework wizard.
#### UI/Presentation
Please do not reference bean icons from `SpringApiIcons` directly, but use `SpringPresentationProvider` to re-use the unified icon/bean name.
See `SpringBeansPsiElementCellRenderer` as a 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 the 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 the "Spring Boot" plugin to be activated.
All available extension points are provided under the `com.intellij.spring.boot` prefix.
### Spring Boot Library
Use `com.intellij.spring.boot.library.SpringBootLibraryUtil` to query the 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 the module (e.g., setup integration with a build system).
### Endpoint Tab
Use to add custom actuator endpoint tabs.
Any settings should be exposed in the "Spring Boot" settings tab via .