Проводка весны 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
