Профиль по умолчанию в Spring 3.1


в моем приложении у меня есть бобы с аннотацией @Profile("prod") и @Profile("demo"). Первый, как вы можете догадаться :), используется на бобах, которые подключаются к производственной БД, а второй аннотирует бобы, которые используют некоторые поддельные БД (HashMap или что угодно) - чтобы сделать развитие быстрее.

что я хотел бы иметь профиль по умолчанию ("prod"), который будет использоваться всегда, если он не переопределяется "что-нибудь".

идеальным было бы иметь в моем web.xml:

<context-param>
     <param-name>spring.profiles.active</param-name>
     <param-value>prod</param-value>
</context-param>

и затем переопределить это с -Dspring.profiles.active="demo" чтобы я мог сделать:

mvn jetty:run -Dspring.profiles.active="demo". 

но, к сожалению, это не работает. Есть идеи, как я могу достичь этого? Установка -Dspring.profiles.active="prod" на всех моих условиях это не вариант.

7 96

7 ответов:

мой опыт заключается в том, что с помощью

@Profile("default")

боб будет добавлен в контекст только в том случае, если не будет идентифицирован другой профиль. Если вы проходите в другой профиль, например -Dspring.profiles.active="demo" этот профиль игнорируется.

определите свою производственную среду как профиль по умолчанию в вашем интернете.xml

<context-param>
   <param-name>spring.profiles.default</param-name>
   <param-value>prod</param-value>
</context-param>

и если вы хотите использовать другой профиль, передайте его как системное свойство

mvn -Dspring.profiles.active="demo" jetty:run

вы также можете рассмотреть возможность удаления профиля PROD и использовать @Profile ("!демо")

У меня та же проблема, но я использую WebApplicationInitializer для того, чтобы настроить ServletContext программно (сервлет 3.0+). Поэтому я делаю следующее:

public class WebAppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext sc) throws ServletException {
        // Create the 'root' Spring application context
        final AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
        // Default active profiles can be overridden by the environment variable 'SPRING_PROFILES_ACTIVE'
        rootContext.getEnvironment().setDefaultProfiles("prod");
        rootContext.register(AppConfig.class);

        // Manage the lifecycle of the root application context
        sc.addListener(new ContextLoaderListener(rootContext));
    }
}

о настройке производственного профиля по умолчанию уже опубликовано @andih

самый простой способ установить профиль по умолчанию для плагина Maven jetty, это включить элемент ниже в конфигурацию плагина:

<plugin>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <configuration>
        <systemProperties>
            <systemProperty>
                <name>spring.profiles.active</name>
                <value>demo</value>
            </systemProperty>
        </systemProperties>
    </configuration>
</plugin>

Spring предоставляет два отдельных свойства при определении того, какие профили активны:

  • spring.profiles.active

и

  • spring.profiles.default

если spring.profiles.active устанавливается, затем его значение определяет, какие профили активны. Но если spring.profiles.active не установлен, то весна смотрит на spring.profiles.default.

, если не spring.profiles.active, ни spring.profiles.default, то есть нет активных профилей, и только те бобы, которые не определены как находясь в профиле создаются.Любой компонент, который не указывает профиль, принадлежит default профиль.

вы можете настроить ваш веб.xml как отфильтрованный ресурс и имеет это значение, заполненное maven из настроек профиля maven-это то, что мы делаем.

в POM фильтровать все ресурсы (вы можете сделать taht, если у вас нет ${} маркировки в них)

<webResources>
    <resource>
        <directory>src/main/webapp</directory>
        <filtering>true</filtering>
    </resource>
</webResources>

в интернете.xml put

<context-param>
     <param-name>spring.profiles.active</param-name>
     <param-value>${spring.prfile}</param-value>
</context-param>

в pom создать профили maven

<profiles>
    <profile>
        <id>DEFAULT</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <spring.profile>prod</spring.profile>
        </properties>
    <profile>
    <profile>
        <id>DEMO</id>
        <properties>
            <spring.profile>demo</spring.profile>
        </properties>
    <profile>
</profiles>

теперь вы можете использовать

mvn jetty:run -P DEMO

или просто -P DEMO С любой командой maven