Какие ключевые аннотации Spring используются для Java-based конфигурации?

Ответ

Java-based конфигурация в Spring заменяет XML и основана на аннотациях. Вот основные из них:

1. @Configuration Помечает класс как источник определений бинов. Внутри такого класса методы, аннотированные @Bean, создают экземпляры бинов.

@Configuration
public class AppConfig {
    @Bean
    public DataSource dataSource() {
        return new EmbeddedDatabaseBuilder()
                .setType(EmbeddedDatabaseType.H2)
                .build();
    }
}

2. @Bean Объявляет метод, который возвращает объект, управляемый Spring-контейнером. Название метода по умолчанию становится именем бина.

3. @ComponentScan Указывает пакеты для автоматического обнаружения и регистрации компонентов (@Component, @Service, @Repository, @Controller).

@Configuration
@ComponentScan("com.example.services", "com.example.repositories")
public class AppConfig {}

4. @PropertySource & @Value Загружают свойства из файлов и инжектируют их.

@Configuration
@PropertySource("classpath:application.properties")
public class AppConfig {
    @Value("${db.url}")
    private String dbUrl;

    @Bean
    public MyService myService() {
        return new MyService(dbUrl);
    }
}

5. @Profile Активирует конфигурацию или бин только для указанного профиля (например, dev, test, prod).

@Configuration
@Profile("dev")
public class DevConfig {
    @Bean
    public DataSource devDataSource() {
        // Конфигурация для разработки
    }
}

6. @Import Позволяет импортировать другие классы конфигурации, модулируя настройку.

@Configuration
@Import({DatabaseConfig.class, SecurityConfig.class})
public class MainConfig {}

7. @Conditional и его производные (Spring Boot) Условное создание бина на основе заданного условия (например, @ConditionalOnClass, @ConditionalOnProperty).

Spring Boot упрощает это: аннотация @SpringBootApplication объединяет @Configuration, @ComponentScan и @EnableAutoConfiguration.

Ответ 18+ 🔞

А, ну вот, смотри, опять эти ваши конфигурации, блядь. Раньше XML был, там хоть понятно — натыкал тегов, как бусы на нитку, и всё, пиздец. А теперь, сука, Java-based, аннотации, всё такое. Ну ладно, разберёмся, хуле.

1. @Configuration Это типа главный объявитель, блядь. Помечаешь класс — и он становится священной коровой, источником всех бинов. Внутри него методы с @Bean плодят экземпляры, как кролики.

@Configuration
public class AppConfig {
    @Bean
    public DataSource dataSource() {
        return new EmbeddedDatabaseBuilder()
                .setType(EmbeddedDatabaseType.H2)
                .build();
    }
}

Видишь? Объявил dataSource() — и всё, теперь у тебя есть бин с таким же именем. Красота, в рот меня чих-пых!

2. @Bean Это, блядь, волшебная палочка. Написал метод, вернул из него объект — и Spring его подхватит, завернёт в плёнку и будет им управлять. Имя бина — это название метода, если, конечно, ты не выёбываешься и не переименовываешь специально.

3. @ComponentScan А это, сука, сканер, как в аэропорту, только ищет не ножи, а твои компоненты. Говоришь ему: «Ищи вот в этих пакетах!» — и он находит все классы с @Component, @Service, @Repository, @Controller. Автоматически регистрирует, ёпта.

@Configuration
@ComponentScan("com.example.services", "com.example.repositories")
public class AppConfig {}

Вот так, два пакета указал — и всё, они уже в контейнере, как селёдки в бочке.

4. @PropertySource & @Value Это для тех, кто любит настройки из файлов таскать. @PropertySource грузит свойства, а @Value их, сука, впихивает куда надо.

@Configuration
@PropertySource("classpath:application.properties")
public class AppConfig {
    @Value("${db.url}")
    private String dbUrl;

    @Bean
    public MyService myService() {
        return new MyService(dbUrl);
    }
}

Смотри: взял db.url из файлика, засунул в переменную, потом передал в сервис. Удобно, блядь, не надо руками прописывать.

5. @Profile А это, ёпта, для раздолбаев, которые путают среду разработки с продакшеном. Говоришь: «Этот бин только для dev!» — и он в других профилях не появится, как призрак.

@Configuration
@Profile("dev")
public class DevConfig {
    @Bean
    public DataSource devDataSource() {
        // Конфигурация для разработки
    }
}

Типа, на тестовом сервере один datasource, на боевом — другой. Умно, блядь, а то бывает, настройки перепутаешь — и пиши пропало.

6. @Import Это когда конфигураций, блядь, овердохуища, и ты хочешь их разбить на модули. Импортируешь одни в другие — и всё собирается, как пазл.

@Configuration
@Import({DatabaseConfig.class, SecurityConfig.class})
public class MainConfig {}

Вот так: главный конфиг подтянул базу и безопасность. Красота, не надо всё в одну кучу сваливать.

7. @Conditional и его производные (Spring Boot) А это, сука, высший пилотаж. Бин создаётся только если выполняется условие. Например, @ConditionalOnClass — если класс есть в classpath, или @ConditionalOnProperty — если в настройках нужное значение. Удобно, блядь, для кастомных фич.

А Spring Boot, ёпта, вообще всё упрощает: там есть аннотация @SpringBootApplication. Это типа три в одном, как шампунь-кондиционер-бальзам. Она объединяет @Configuration, @ComponentScan и @EnableAutoConfiguration. Написал её — и всё, можно не париться, контейнер сам всё настроит, как умный дом. Ну, почти сам, блядь.