← Назад к вопросам

Создает ли @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
        );
    }
}

Главные выводы

  1. @Configuration — это контейнер для @Bean методов
  2. @Bean методы — создают и конфигурируют бины
  3. Spring управляет зависимостями — автоматически передаёт параметры
  4. Используй для complex configuration — внешние библиотеки, условные бины
  5. Порядок important — Spring решает зависимости автоматически