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, що означає, що його не можна згодом змінити.