← Назад к вопросам
Какая аннотация используется для работы с профилями в 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 контекста