Проводка весны default с профилем

у меня есть два боба. Оба реализуют функцию рассылки. Один работает только тогда, когда он развернут на сервере приложений. Другой используется для тестирования.

у нас есть профиль для каждого разработчика и окружающей среды. Я хочу подключить тестирующий Боб только при фактическом тестировании. Другой фасоль должен быть использован когда не испытывать. Как я могу это архивировать?

@Component
@Profile("localtest")
public class OfflineMail implements Mailing {}

пути решения:

используя "default", я где-то читал это, но, похоже, есть нет возврата к " по умолчанию "для профиля типа"dev":

@Component
@Profile("default")
public class OnlineMail implements Mailing {}

-> исключение для No bean для проводки не найдено.

оставляя профиль:

@Component
public class OnlineMail implements Mailing {}

- > создает уникальное исключение при запуске профиля "localtest".

добавление всех профилей:

@Component
@Profile("prod")
@Profile("integration")
@Profile("test")
@Profile("dev1")
@Profile("dev2")
@Profile("dev3")
...
public class OnlineMail implements Mailing {}

это на самом деле работает, однако наши разработчики не пронумерованы они используют "dev" и добавление профилей, может работать для одного компонента, но один попадет в беду, когда использование его для нескольких бобов, поскольку это определенно становится уродливым.

Используя что-то вроде @Profile("!localtest") не похоже на работу.

кто-нибудь знает лучший способ получить "провод по умолчанию, если не найден конкретный Боб"?

3 ответов


я, наконец, нашел простое решение.

онлайн-почта просто проводная по умолчанию.

@Component
public class OnlineMail implements Mailing {}

С помощью @Primary аннотация автономная почта имеет приоритет над OnlineMail и избегает уникального исключения.

@Component
@Profile("localtest")
@Primary
public class OfflineMail implements Mailing {}

попробуйте это:

@Component
@Profile("production")
public class OnlineMail implements Mailing {}

@Component
@Profile("localtest")
public class OfflineMail implements Mailing {}

затем запустите тесты с помощью @ActiveProfiles ("localtest") и запустите производственную среду с помощью" production " как по умолчанию профиль.

также я надеюсь в следующей версии Spring ActiveProfilesResolver будет введен SPR-10338 - это может быть полезно для вас (чтобы избежать "dev1", "dev2" и так далее).


поддержки весны впрыскивают фасоль @ профилем очень хорошо:

interface Talkative {
    String talk();
}

@Component
@Profile("dev")
class Cat implements Talkative {
        public String talk() {
        return "Meow.";
    }
}

@Component
@Profile("prod")
class Dog implements Talkative {
    public String talk() {
        return "Woof!";
    }
}

работает в тестовом блоке

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContex-test.xml"})
@ActiveProfiles(value = "dev")
public class InjectByDevProfileTest
{
    @Autowired
    Talkative talkative;

    @Test
    public void TestTalkative() {
        String result = talkative.talk();
        Assert.assertEquals("Meow.", result);

    }
}

работает в Main():

@компонентов общественного класса Main {

        public static void main(String[] args) {
            // Enable a "dev" profile
            System.setProperty(AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME, "dev");
            ApplicationContext context =
                    new ClassPathXmlApplicationContext("applicationContext.xml");
            Main p = context.getBean(Main.class);
            p.start(args);
        }

        @Autowired
        private Talkative talkative;

        private void start(String[] args) {
            System.out.println(talkative.talk());
        }
    }

проверьте это для демо-кода:https://github.com/m2land/InjectByProfile