← Назад к вопросам
Для чего нужна аннотация Configuration в Spring?
1.3 Junior🔥 251 комментариев
#Spring Framework
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# Аннотация @Configuration в Spring: назначение и применение
@Configuration — это аннотация в Spring, которая обозначает класс как источник конфигурации бинов. Она эквивалентна XML файлу конфигурации, но в виде Java кода.
Основное назначение
@Configuration используется для:
- Определения бинов через методы @Bean
- Замены XML конфигурации на Java код
- Структурирования конфигурации приложения
- Условной регистрации бинов
Базовый пример
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 ирование | CGLIB | JDK 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();
}
}
Лучшие практики
- Одна @Configuration на функцию
@Configuration
public class DatabaseConfig { }
@Configuration
public class SecurityConfig { }
@Configuration
public class CacheConfig { }
- Используй @Bean для внешних библиотек
@Configuration
public class ThirdPartyConfig {
@Bean
public DataSource dataSource() {
return new HikariDataSource();
}
}
- Используй @Component для своего кода
@Service
public class UserService { }
@Repository
public class UserRepository { }
- Структурируй конфигурации по функциям
@Configuration
public class AppConfig {
// Главная конфигурация
@Configuration
static class DatabaseConfig { }
@Configuration
static class SecurityConfig { }
}
Итог
@Configuration — это аннотация для определения конфигурации Spring приложения через Java код. Она заменяет XML конфигурацию и позволяет:
- Создавать бины через @Bean методы
- Управлять зависимостями в коде
- Делать конфигурацию типобезопасной
- Использовать условную регистрацию бинов
Это современный стандарт конфигурации в Spring.