# Spring

Ядро Spring Framework основнано на принципе инверсии управления (inversion of Control - IoC)

### Основа Spring

Реализация DI (dependency injection) в Spring основана на двух концепциях:
- JavaBean
- Интерфейсы

В Spring любой управляемый ресурс - это bean

С помощью интерфейсов можно получить максимальную отдачу от DI бины могут использовать любую реализацию интерфейса для удовлетворения зависимости.

Конфигурирование через XML или классы Java, или аннотации в коде, или через Groovy.

### Три кита Spring-приложений

**Core** - обеспечивает ключевые части фреймворка, включая свойства IoC и DI.

**Beans** - классы, созданием экземпляров которых и установкой в них зависимстей управляет контейрнер фреймворка Spring.

**Context** построен на основе Beans и Core и позволяет получить доступ к любому объекту, который определён в настройках. Ключевым элементом модуля `Context` является интерфейс `ApplicationContext`.

```java
interface Music {}

class ClassicalMusic implements Music {}
class RockMusic implements Music {}

class MusicPlayer {
  private Music music;

  public void play() {
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
	// ...
    music = context.getBean("classicalMusic", ClassicalMusic.class);
    // ...
    music = context.getBean("rockMusic", RockMusic.class);
    // ...
  }
}
```
