← Назад к вопросам
Создает ли @Configuration бины
1.7 Middle🔥 231 комментариев
#Spring Boot и Spring Data#Spring Framework
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
@Configuration и создание бинов в Spring
Ответ: ДА, @Configuration создаёт бины
@Configuration класс содержит методы с @Bean аннотацией, которые создают бины и регистрируют их в ApplicationContext.
Как это работает
@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserService(userRepository());
}
@Bean
public UserRepository userRepository() {
return new UserRepository(dataSource());
}
@Bean
public DataSource dataSource() {
// Создаём и конфигурируем DataSource
return new HikariDataSource(...);
}
}
// Spring при старте делает:
// 1. Создаёт экземпляр AppConfig
// 2. Вызывает dataSource() → создаёт DataSource
// 3. Вызывает userRepository(userRepository(dataSource)) → создаёт UserRepository
// 4. Вызывает userService(userService(userRepository)) → создаёт UserService
// 5. Регистрирует все 3 бина в ApplicationContext
Сравнение: @Configuration vs @Component
@Component @Component
public class UserService { }
// Это ПРОСТО аннотация для auto-scanning
// Spring создаёт new UserService()
// Зависимости внедряются через @Autowired
@Configuration + @Bean @Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserService();
}
}
// ЭТО позволяет:
// - Контролировать как создаётся бин
// - Добавлять логику конфигурации
// - Создавать conditional beans
// - Вручную управлять зависимостями
Практические примеры
1. Конфигурирование DataSource
@Configuration
public class DataSourceConfig {
@Bean
public DataSource dataSource() {
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl(System.getenv("DB_URL"));
ds.setUsername(System.getenv("DB_USER"));
ds.setMaximumPoolSize(20);
return ds;
}
}
2. Conditional beans
@Configuration
public class CacheConfig {
@Bean
@ConditionalOnProperty(name = "app.cache.enabled", havingValue = "true")
public CacheManager cacheManager() {
return new RedisCacheManager(...);
}
@Bean
@ConditionalOnProperty(name = "app.cache.enabled", havingValue = "false")
public CacheManager noOpCacheManager() {
return new NoOpCacheManager();
}
}
3. Зависимости между бинами
@Configuration
public class ServiceConfig {
@Bean
public UserRepository userRepository() {
return new UserRepository();
}
@Bean
public UserService userService(UserRepository repository) {
// Spring автоматически передаёт repository!
return new UserService(repository);
}
}
Order of execution
Когда у тебя несколько @Bean методов:
@Configuration
public class Config {
@Bean
public A beanA(B b) { // Зависит от B
return new A(b);
}
@Bean
public B beanB() { // Не зависит ни от кого
return new B();
}
@Bean
public C beanC(A a) { // Зависит от A
return new C(a);
}
}
// Порядок создания:
// 1. beanB() создаётся первым (no dependencies)
// 2. beanA(beanB) создаётся вторым (нужен beanB)
// 3. beanC(beanA) создаётся третьим (нужен beanA)
@Bean Lifecycle
@Configuration
public class BeanLifecycleConfig {
@Bean(initMethod = "init", destroyMethod = "destroy")
public DataSource dataSource() {
return new DataSource();
}
}
public class DataSource {
public void init() {
// Called after bean creation
System.out.println("Initializing DataSource");
}
public void destroy() {
// Called on application shutdown
System.out.println("Destroying DataSource");
}
}
@Configuration разные способы
XML конфигурация (старый способ) <beans>
<bean id="userService" class="com.example.UserService">
<constructor-arg ref="userRepository"/>
</bean>
</beans>
@Configuration (современный способ) @Configuration
public class AppConfig {
@Bean
public UserService userService(UserRepository repo) {
return new UserService(repo);
}
}
@Component + @Autowired (самый простой) @Component
public class UserService {
@Autowired
private UserRepository repository;
}
Когда использовать что?
@Component:
- Просто class, нужно создать бин
- Зависимости через @Autowired
- Самый простой случай
@Configuration + @Bean:
- Сложная логика конфигурации
- Conditional beans
- External libraries (где нет @Component)
- Нужен контроль над созданием
XML:
- Legacy проекты
- Очень сложная конфигурация
- Не рекомендуется для новых проектов
Пример: Конфигурация RestTemplate
@Configuration
public class HttpClientConfig {
@Bean
public RestTemplate restTemplate(
@Value("${http.timeout:5000}") int timeout) {
RestTemplateBuilder builder = new RestTemplateBuilder()
.setConnectTimeout(Duration.ofMillis(timeout))
.setReadTimeout(Duration.ofMillis(timeout));
return builder.build();
}
}
// Использование
@Service
public class UserClient {
@Autowired
private RestTemplate restTemplate;
public User getUser(Long id) {
return restTemplate.getForObject(
"http://api.example.com/users/" + id,
User.class
);
}
}
Главные выводы
- @Configuration — это контейнер для @Bean методов
- @Bean методы — создают и конфигурируют бины
- Spring управляет зависимостями — автоматически передаёт параметры
- Используй для complex configuration — внешние библиотеки, условные бины
- Порядок important — Spring решает зависимости автоматически