Ответ
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. Написал её — и всё, можно не париться, контейнер сам всё настроит, как умный дом. Ну, почти сам, блядь.