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

Для чего нужна аннотация Configuration в Spring?

1.3 Junior🔥 251 комментариев
#Spring Framework

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Аннотация @Configuration в Spring: назначение и применение

@Configuration — это аннотация в Spring, которая обозначает класс как источник конфигурации бинов. Она эквивалентна XML файлу конфигурации, но в виде Java кода.

Основное назначение

@Configuration используется для:

  1. Определения бинов через методы @Bean
  2. Замены XML конфигурации на Java код
  3. Структурирования конфигурации приложения
  4. Условной регистрации бинов

Базовый пример

XML конфигурация (старый подход)

<beans>
  <bean id="dataSource" class="org.postgresql.ds.PGPoolingDataSource">
    <property name="serverName" value="localhost"/>
    <property name="portNumber" value="5432"/>
  </bean>
  
  <bean id="userRepository" class="com.example.UserRepository">
    <constructor-arg ref="dataSource"/>
  </bean>
</beans>

Java @Configuration (новый подход)

@Configuration
public class AppConfig {
  
  @Bean
  public DataSource dataSource() {
    PGPoolingDataSource ds = new PGPoolingDataSource();
    ds.setServerName("localhost");
    ds.setPortNumber(5432);
    return ds;
  }
  
  @Bean
  public UserRepository userRepository(DataSource dataSource) {
    return new UserRepository(dataSource);
  }
}

Ключевые концепции

1. @Bean методы

@Configuration
public class ApplicationConfig {
  
  // Создаёт бин типа String
  @Bean
  public String appName() {
    return "My Application";
  }
  
  // Создаёт бин типа UserService
  @Bean
  public UserService userService() {
    return new UserService();
  }
  
  // Зависимость: Spring автоматически передаст UserService
  @Bean
  public UserController userController(UserService userService) {
    return new UserController(userService);
  }
}

2. Внедрение зависимостей между @Bean методами

@Configuration
public class DataConfig {
  
  @Bean
  public DataSource dataSource() {
    return new HikariDataSource();
  }
  
  // userRepository получит dataSource автоматически
  @Bean
  public UserRepository userRepository(DataSource dataSource) {
    return new UserRepository(dataSource);
  }
  
  // userService получит и dataSource, и userRepository
  @Bean
  public UserService userService(
      DataSource dataSource,
      UserRepository userRepository) {
    return new UserService(dataSource, userRepository);
  }
}

Практические примеры

1. Конфигурация БД

@Configuration
public class DatabaseConfig {
  
  @Bean
  public DataSource dataSource(
      @Value("${db.url}") String url,
      @Value("${db.user}") String user,
      @Value("${db.password}") String password) {
    
    HikariConfig config = new HikariConfig();
    config.setJdbcUrl(url);
    config.setUsername(user);
    config.setPassword(password);
    config.setMaximumPoolSize(10);
    
    return new HikariDataSource(config);
  }
  
  @Bean
  public JdbcTemplate jdbcTemplate(DataSource dataSource) {
    return new JdbcTemplate(dataSource);
  }
}

2. Конфигурация с условиями

@Configuration
public class EnvironmentConfig {
  
  @Bean
  @Profile("prod")
  public DataSource prodDataSource() {
    // Для production
    return createProductionDataSource();
  }
  
  @Bean
  @Profile("dev")
  public DataSource devDataSource() {
    // Для development
    return createDevDataSource();
  }
  
  @Bean
  @ConditionalOnProperty(name = "cache.enabled", havingValue = "true")
  public CacheManager cacheManager() {
    return new RedisCacheManager();
  }
}

3. Несколько конфигураций

// Основная конфигурация
@Configuration
public class AppConfig {
  
  @Bean
  public ApplicationService applicationService() {
    return new ApplicationService();
  }
}

// Отдельная конфигурация для сервисов
@Configuration
public class ServiceConfig {
  
  @Bean
  public UserService userService() {
    return new UserService();
  }
  
  @Bean
  public OrderService orderService() {
    return new OrderService();
  }
}

// Главный класс
@SpringBootApplication
public class Application {
  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
    // Spring автоматически найдёт все @Configuration классы
  }
}

4. Импорт конфигураций

@Configuration
@Import({DatabaseConfig.class, SecurityConfig.class})
public class RootConfig {
  // Импортирует все бины из других конфигураций
}

// Или в application.properties
# spring.config.import=classpath:db-config.properties

@Configuration vs @Component

Аспект@Configuration@Component
НазначениеКонфигурация биновБизнес-компонент
@Bean методыДаНет
Prox ированиеCGLIBJDK Dynamic Proxy
ИспользованиеКонфигурацияСервисы, контроллеры
// @Configuration: для создания бинов
@Configuration
public class Config {
  @Bean
  public UserService userService() {
    return new UserService();
  }
}

// @Component: для бизнес-логики
@Component
public class UserService {
  public void processUser(User user) { }
}

Full vs Lite @Configuration

// Full @Configuration (по умолчанию)
@Configuration
public class FullConfig {
  
  @Bean
  public DataSource dataSource() {
    return new DataSource();
  }
  
  @Bean
  public UserRepository userRepository() {
    // ПРАВИЛЬНО: вызывает @Bean метод
    return new UserRepository(dataSource());
  }
}

// Lite @Configuration (с proxyBeanMethods = false)
@Configuration(proxyBeanMethods = false)
public class LiteConfig {
  
  @Bean
  public DataSource dataSource() {
    return new DataSource();
  }
  
  @Bean
  public UserRepository userRepository() {
    // Прямой вызов метода (не через бин контейнер)
    return new UserRepository(dataSource());
  }
}

Условная регистрация бинов

@Configuration
public class ConditionalConfig {
  
  // Создай бин только если класс в classpath
  @ConditionalOnClass(RedisTemplate.class)
  @Bean
  public CacheManager redisCacheManager() {
    return new RedisCacheManager();
  }
  
  // Создай бин только если свойство установлено
  @ConditionalOnProperty(
    name = "app.feature.enabled",
    havingValue = "true"
  )
  @Bean
  public FeatureService featureService() {
    return new FeatureService();
  }
  
  // Создай бин только если других бинов нет
  @ConditionalOnMissingBean(CacheManager.class)
  @Bean
  public CacheManager defaultCacheManager() {
    return new SimpleCacheManager();
  }
}

Лучшие практики

  1. Одна @Configuration на функцию
@Configuration
public class DatabaseConfig { }

@Configuration
public class SecurityConfig { }

@Configuration
public class CacheConfig { }
  1. Используй @Bean для внешних библиотек
@Configuration
public class ThirdPartyConfig {
  
  @Bean
  public DataSource dataSource() {
    return new HikariDataSource();
  }
}
  1. Используй @Component для своего кода
@Service
public class UserService { }

@Repository
public class UserRepository { }
  1. Структурируй конфигурации по функциям
@Configuration
public class AppConfig {
  // Главная конфигурация
  
  @Configuration
  static class DatabaseConfig { }
  
  @Configuration
  static class SecurityConfig { }
}

Итог

@Configuration — это аннотация для определения конфигурации Spring приложения через Java код. Она заменяет XML конфигурацию и позволяет:

  1. Создавать бины через @Bean методы
  2. Управлять зависимостями в коде
  3. Делать конфигурацию типобезопасной
  4. Использовать условную регистрацию бинов

Это современный стандарт конфигурации в Spring.