Spring Boot предпочитает конфигурацию на основе Java. Хотя можно использовать SpringApplication и с XML-исходниками, мы обычно рекомендуем, чтобы основным исходником был один класс, аннотированный @Configuration. Обычно класс, определяющий метод main, является подходящим кандидатом на роль основной @Configuration.

В Интернете опубликовано множество примеров конфигурации Spring, в которых используется XML-конфигурация. Если возможно, всегда старайтесь использовать эквивалентную конфигурацию на базе Java. Поиск аннотаций Enable* может стать хорошей отправной точкой.

Импорт дополнительных конфигурационных классов

Вам не нужно помещать все аннотации @Configuration в один класс. Можно использовать аннотацию @Import для импорта дополнительных классов конфигурации. Кроме того, можно использовать аннотацию @ComponentScan для автоматического сбора всех компонентов Spring, включая классы с аннотацией @Configuration.

Импорт XML-конфигурации

Если в обязательном порядке требуется использовать конфигурацию на основе XML, мы рекомендуем все же начать с класса, помеченного аннотацией @Configuration. Затем можно использовать аннотацию @ImportResource для загрузки конфигурационных XML-файлов.

Автоконфигурация

Автоконфигурация в Spring Boot пытается автоматически конфигурировать ваше приложение Spring на основе добавленных jar-зависимостей. Например, если HSQLDB находится в вашем classpath, но вы не сконфигурировали вручную никаких бинов для подключения к базе данных, то Spring Boot автоматически сконфигурирует резидентную базу данных.

Необходимо явно согласиться на автоконфигурацию, добавив аннотации @EnableAutoConfiguration или @SpringBootApplication в один из ваших классов с аннотацией @Configuration.

Следует добавлять только одну аннотацию @SpringBootApplication или @EnableAutoConfiguration. Обычно мы рекомендуем добавлять ту или иную аннотацию только в первичный класс, аннотированный @Configuration.

Постепенная замена автоконфигурации

Автоконфигурация работает неагрессивно. В любой момент можно начать определять свою собственную конфигурацию, чтобы заменить определенные части автоконфигурации. Например, если вы добавите свой собственный бин DataSource, то средства поддержки встроенной базы данных по умолчанию отключатся.

Если необходимо узнать, какая автоконфигурация применяется в данный момент и почему, запустите приложение с параметром --debug. Это позволит активировать отладочные журналы для выбранных основных диспетчеров журналирования и вывести отчет об условиях на консоль.

Отключение определенных классов автоконфигурации

Если вы обнаружите, что применяются определенные классы автоконфигурации, которые вам не нужны, то можете использовать атрибут исключения (exclude) в аннотации @SpringBootApplication, чтобы отключить их, как показано в следующем примере:

Java
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class MyApplication {
}
Kotlin
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
@SpringBootApplication(exclude = [DataSourceAutoConfiguration::class])
class MyApplication

Если класса нет в classpath, можно использовать атрибут excludeName аннотации и задать вместо него полное имя. Если вы предпочитаете использовать аннотацию @EnableAutoConfiguration, а не @SpringBootApplication, функции exclude и excludeName будут тоже доступны. Наконец, можно контролировать список исключаемых классов автоконфигурации с помощью свойства spring.autoconfigure.exclude.

Вы можете определить исключения как на уровне аннотации, так и с помощью свойства.
Несмотря на то, что классы автоконфигурации являются public, единственным аспектом класса, который считается публичным APIом, является имя класса, которое может быть использовано для отключения автоконфигурации. Фактическое содержимое этих классов, такое как вложенные конфигурационные классы или методы бинов, предназначено только для внутреннего использования, и мы не рекомендуем использовать их напрямую.

Spring Beans и внедрение зависимостей

Вы можете использовать любое из стандартных средств Spring Framework для определения ваших бинов и их внедряемых зависимостей. Обычно мы рекомендуем использовать внедрение зависимостей через конструктор для связывания зависимостей и аннотацию @ComponentScan для поиска бинов.

Если вы будете структурировать свой код, как было предложено выше (размещая класс приложения в верхнем пакете), то можете добавлять аннотацию @ComponentScan без каких-либо аргументов или использовать аннотацию @SpringBootApplication, которая неявно содержит её. Все компоненты вашего приложения (аннотации @Component, @Service, @Repository, @Controller и другие) автоматически регистрируются как бины Spring.

В следующем примере показан бин, помеченный аннотацией @Service, который использует внедрение зависимостей через конструктор для получения требуемого бина RiskAssessor:

Java
import org.springframework.stereotype.Service;
@Service
public class MyAccountService implements AccountService {
    private final RiskAssessor riskAssessor;
    public MyAccountService(RiskAssessor riskAssessor) {
        this.riskAssessor = riskAssessor;
    }
    // ...
}
Kotlin
import org.springframework.stereotype.Service
@Service
class MyAccountService(private val riskAssessor: RiskAssessor) : AccountService

Если бин имеет более одного конструктора, то нужно отметить тот, который нужно использовать Spring, аннотацией @Autowired:

Java
import java.io.PrintStream;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class MyAccountService implements AccountService {
    private final RiskAssessor riskAssessor;
    private final PrintStream out;
    @Autowired
    public MyAccountService(RiskAssessor riskAssessor) {
        this.riskAssessor = riskAssessor;
        this.out = System.out;
    }
    public MyAccountService(RiskAssessor riskAssessor, PrintStream out) {
        this.riskAssessor = riskAssessor;
        this.out = out;
    }
    // ...
}
Kotlin
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
import java.io.PrintStream
@Service
class MyAccountService : AccountService {
    private val riskAssessor: RiskAssessor
    private val out: PrintStream
    @Autowired
    constructor(riskAssessor: RiskAssessor) {
        this.riskAssessor = riskAssessor
        out = System.out
    }
    constructor(riskAssessor: RiskAssessor, out: PrintStream) {
        this.riskAssessor = riskAssessor
        this.out = out
    }
    // ...
}
Обратите внимание, что использование внедрения зависимостей через конструктор позволяет пометить поле riskAssessor как final, что означает, что его нельзя впоследствии изменить.