Почему Spring Класс загрузочного приложения должен иметь аннотацию @Configuration?

Я изучаю Spring Framework, но я не могу понять, что именно означает аннотация @Configuration и какие классы должны быть аннотированы так. В документах Spring Boot сказано, что класс Application должен быть @Configuration class.

Spring Загрузка поддерживает конфигурацию на основе Java. Хотя возможно для вызова SpringApplication.run() с источником XML, мы обычно рекомендуется, чтобы ваш основной источник был классом @Configuration.

Попытка узнать о @Configuration Я нахожу, что аннотирование класса с помощью @Configuration означает, что класс может использоваться контейнером IoC Spring как источник определений bean.

Если это так, то каким образом этот класс приложения является источником определений bean?

@SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan
public class App 
{
    public static void main(String[] args) throws Exception {
        SpringApplication.run(App.class, args);    
    }
}

В основном я понял большинство других основных понятий относительно Spring, но я не могу понять цель @Configuration или какие классы должны быть @Configuration классами? Может кому-то помочь. Спасибо!

Ответ 1

Вы поняли это правильно.

@Configuration

@Configuration является аналогом для xml файла. Такие классы являются источниками определения bean, определяя методы с аннотацией @Bean.

@Configuration:

  • не требуется, если вы уже передали аннотированный класс в параметре sources при вызове метода SpringApplication.run();
  • требуется, если вы не передаете аннотированный класс явно, но он находится в пакете, указанном в аннотации @ComponentScan вашего основного класса конфигурации.

Для удобства чтения классы, которые явно передаются как sources, могут быть аннотированы с помощью @Configuration - только для того, чтобы показать намерения более четко.

Ваш текущий класс на самом деле не является источником определений bean, потому что он его не имеет, но если бы у вас были @Bean аннотированные методы, Spring увидит их.

@EnableAutoConfiguratiom

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

Этот ответ также может быть полезен для понимания процесса инициализации загрузки Spring: Какой фрагмент кода в Spring Загрузка фактически регистрирует сервлет диспетчера для SpringMVC?

Ответ 2

Я думаю, что основная причина, почему Spring Загрузка @SpringBootApplication аннотации автоматически применяется @Configuration - это позволить добавлять определения bean в тот же класс. Одна из основных целей Spring Boot - позволить вам быстро создавать приложение и без дополнительных движений. Поэтому, позволяя добавлять определения bean прямо в класс приложения, вам не нужно создавать дополнительные классы для хранения вашей конфигурации. У вас всего 1 класс и что он.