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

Какая аннотация используется для работы с профилями в Spring?

1.0 Junior🔥 131 комментариев
#Spring Boot и Spring Data#Spring Framework

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

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

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

Какая аннотация используется для работы с профилями в Spring?

Для работы с профилями в Spring используется аннотация @Profile. Она позволяет условно регистрировать beans и конфигурационные классы в зависимости от активного профиля приложения (например, development, test, production).

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

Аннотация @Profile используется для того, чтобы:

  • Создавать разные конфигурации для разных окружений
  • Регистрировать разные реализации одного интерфейса
  • Избежать дублирования конфигурационного кода
  • Управлять зависимостями в зависимости от контекста

Синтаксис использования

// На уровне класса конфигурации
@Configuration
@Profile("development")
public class DevelopmentConfig {
    @Bean
    public DataSource dataSource() {
        return new EmbeddedDatabaseBuilder()
            .setType(EmbeddedDatabaseType.H2)
            .build();
    }
}

// На уровне отдельного bean
@Configuration
public class ApplicationConfig {
    @Bean
    @Profile("production")
    public DataSource productionDataSource() {
        // Production database
        return createProductionDataSource();
    }
    
    @Bean
    @Profile({"development", "test"})
    public DataSource developmentDataSource() {
        // Development or test database
        return createH2DataSource();
    }
}

// На уровне компонента
@Component
@Profile("!production")  // Не регистрировать в production
public class DebugLogger {
    public void debug(String message) {
        System.out.println("[DEBUG] " + message);
    }
}

Множественные профили

// Bean будет зарегистрирован, если активен любой из указанных профилей
@Configuration
@Profile({"development", "test"})
public class TestAndDevConfig {
    // ...
}

// Отрицание профиля
@Component
@Profile("!production")  // Активен если production НЕ включён
public class MockEmailService {
    // ...
}

// Сложные условия (Spring 5.1+)
@Component
@Profile("(dev | test) & !prod")
public class ConditionalService {
    // ...
}

Практический пример: разные реализации для разных окружений

// Интерфейс
public interface EmailService {
    void sendEmail(String to, String subject, String body);
}

// Production реализация
@Component
@Profile("production")
public class SmtpEmailService implements EmailService {
    @Override
    public void sendEmail(String to, String subject, String body) {
        // Отправляет реальный email через SMTP
        System.out.println("Sending real email to " + to);
    }
}

// Development реализация
@Component
@Profile("development")
public class ConsoleEmailService implements EmailService {
    @Override
    public void sendEmail(String to, String subject, String body) {
        // Логирует в консоль вместо отправки
        System.out.println("[DEV] Email to " + to + ": " + subject);
    }
}

// Test реализация
@Component
@Profile("test")
public class MockEmailService implements EmailService {
    private List<Email> sentEmails = new ArrayList<>();
    
    @Override
    public void sendEmail(String to, String subject, String body) {
        sentEmails.add(new Email(to, subject, body));
    }
    
    public List<Email> getSentEmails() {
        return sentEmails;
    }
}

Как активировать профиль

1. Через application.properties

# application.properties
spring.profiles.active=production

2. Через application-*.properties файлы

application.properties          # базовая конфигурация
application-development.properties  # для development
application-production.properties   # для production
application-test.properties         # для test

Spring автоматически загружает application-{profile}.properties в зависимости от активного профиля.

3. Через переменную окружения

export SPRING_PROFILES_ACTIVE=production
java -jar app.jar

4. Через системное свойство JVM

java -Dspring.profiles.active=production -jar app.jar

5. Программно

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(Application.class);
        app.setAdditionalProfiles("production");
        app.run(args);
    }
}

Пример с конфигурацией БД для разных профилей

@Configuration
public class DataSourceConfig {
    
    @Bean
    @Profile("development")
    public DataSource devDataSource() {
        return DataSourceBuilder.create()
            .driverClassName("org.h2.Driver")
            .url("jdbc:h2:mem:testdb")
            .username("sa")
            .password("")
            .build();
    }
    
    @Bean
    @Profile("production")
    public DataSource prodDataSource(
        @Value("${db.host}") String host,
        @Value("${db.port}") int port,
        @Value("${db.name}") String dbName,
        @Value("${db.username}") String username,
        @Value("${db.password}") String password
    ) {
        return DataSourceBuilder.create()
            .driverClassName("org.postgresql.Driver")
            .url("jdbc:postgresql://" + host + ":" + port + "/" + dbName)
            .username(username)
            .password(password)
            .build();
    }
    
    @Bean
    @Profile("test")
    public DataSource testDataSource() {
        return new EmbeddedDatabaseBuilder()
            .setType(EmbeddedDatabaseType.H2)
            .addScript("classpath:schema.sql")
            .addScript("classpath:test-data.sql")
            .build();
    }
}

Использование @Profile с @ConfigurationProperties

@Configuration
@Profile("production")
@ConfigurationProperties(prefix = "app")
public class ProductionAppConfig {
    private String environment = "production";
    private int maxConnections = 100;
    private boolean enableCache = true;
    
    // getters и setters
}

Проверка активного профиля во время выполнения

@Component
public class AppInitializer {
    @Autowired
    private Environment environment;
    
    public void init() {
        if(environment.acceptsProfiles("development")) {
            System.out.println("Running in development mode");
        }
        
        String[] activeProfiles = environment.getActiveProfiles();
        System.out.println("Active profiles: " + Arrays.toString(activeProfiles));
    }
}

Важные замечания

  • Если профиль не указан, Spring использует "default" профиль
  • Можно активировать несколько профилей одновременно
  • Профили чувствительны к регистру
  • @Profile работает с @Configuration, @Component, @Bean аннотациями
  • Условное определение bean-ов происходит на этапе инициализации Spring контекста
Какая аннотация используется для работы с профилями в Spring? | PrepBro