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