Часто у нас есть тесты и производственная среда, отличающаяся друг от друга. В зависимости от некоторых параметров конфигурации некоторые классы не обязательны для регистрации в качестве бобов в контейнере (при использовании пружины). Есть ли способ динамически пропускать такие классы из контекста приложения?Как исключить класс из Spring с помощью нового интерфейса условий?
ответ
Использование Spring 4 @ Консольная аннотация мы можем.
Проверить here для деталей интерфейса Spring Состояния
Сначала нужно создать класс сказать- «ComponentScanCondition, который реализует в Spring„состояние“интерфейс. И единственный метод„спички“возвращает ложь, если системное свойство не является нулевым или это среда «тест».
public class ComponentScanCondition implements Condition{
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metaData) {
return System.getProperty("environment")!=null && System.getProperty("environment").equals("test")? false:true;
}
}
Теперь с annotation- @Conditional (ComponentScanCondition.class) вы можете контролировать компонент сканирования на классы не нужно в тестовой среде.
В тесте JUnit класса, установить системное свойство, как показано ниже:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class testMyClass{
@BeforeClass
public static void setUpBeforeClass() throws Exception{
System.setProperty("environment", "test");
}
@Test
public void testSomeMethod(){
}
}
И в классах, не требуется в тесте, используйте @Conditional аннотации .Для если вам не нужен класс UserProfile в тестовой среде , пропустите его, как показано ниже:
@service("userProfile")
@Conditional(ComponentScanCondition.class)
public class UserProfile{
}
как и в тестовом классе «окружающей среды» системное свойство имеет значение «тест», соответствует метод возвращает ложь и весна будет пропускать класс UserProfile для сканирования.
В проде среде это свойство не будет установлены и будет нулевым, так матчи будут возвращать истинный и, следовательно, UserProfile (и тот класс с @Conditional) будет сканироваться Spring для регистрации в качестве бобов в контейнере.
Если класс, который должен был использоваться в тесте доступен только путь к классам во время тестирования, и ваша проблема заключается в замене инъекционных классов, то вы можете аннотировать класс, который используется в тестах с @Primary аннотацию.
@Primary - особенность весны, которая намного старше, чем условия, и менее мощная, но она очень проста в использовании. Говорит: когда точка впрыска могла быть выполнена с двумя компонентами, тогда используйте компонент, который аннотируется @Primary
, вместо этого генерируя исключение, которое жалуется на неоднозначные бобы.
Итак, когда вы добавляете компонент в область проверки с аннотацией @Primary
, этот компонент заменяет исходный компонент в точках его впрыска.
Вы также можете установить основной флаг в xml. – Ralph
@ Steer360; Пожалуйста, прочтите мой ответ еще раз, особенно первый абзац. – Ralph
Я читал. Я не могу заменить введенный класс. Требуются введенные классы. И если для теста я должен комментировать @Primary, тогда, когда он будет в процессе производства, мне нужно будет удалить эту аннотацию из класса ?. Моя цель состоит в том, чтобы сделать его динамически, независимо от того, что я комментирую, должен работать без проблем как для prod, так и для теста. пожалуйста, порекомендуйте. – Steer360
- 1. Исключить реализацию интерфейса с помощью Astah API
- 2. Как исключить файлы с использованием условий .htaccess
- 3. Как исключить класс из сканирования с помощью CDI 1.0
- 4. Исключить класс из функции
- 5. Исключить класс из отладки
- 6. Исключить класс из зависимости
- 7. Исключить список пар условий из Джанго QuerySet
- 8. Исключить конкретный класс из теста Spring Component. Проверка интеграции
- 9. NoSuchBeanDefinitionException при внедрении нового интерфейса
- 10. Как сгенерировать класс из интерфейса
- 11. Исключить записи проверки двух условий
- 12. Как исключить анонимный класс из jacoco?
- 13. Как исключить класс из файла YAML?
- 14. Как исключить один класс из java.util.logging.Logger
- 15. Как исключить класс из покрытия Jacoco?
- 16. Как исключить определенные символы из аналогичных условий в Oracle
- 17. Попытка исключить категорию из нового Wordpress 3.8
- 18. решение Конструкция: расширение интерфейса против нового интерфейса
- 19. Исключить ветки из дерева условий, удалить неиспользуемый код
- 20. Создать базовый класс из интерфейса
- 21. Spring Освещенный объект в объекте, созданный с помощью нового()
- 22. C# - Можно ли расширить существующий встроенный класс с помощью нового интерфейса.
- 23. Как этот код способен создавать экземпляр нового объекта из интерфейса?
- 24. Spring MVC - Исключить активы из всех перехватчиков
- 25. Spring - исключить ошибку валидации?
- 26. Log4j неправильный класс с использованием Spring AOP
- 27. Как исключить поля из формы, созданной с помощью PolymorphicChildModelAdmin
- 28. Целевая аудитория JaCoCo: Как исключить класс из jar из отчета?
- 29. Spring Security: исключить URL из SiteMinder
- 30. Исключить класс по классу?
Почему вы не используете механизм, доступный из коробки: профили? – kryger