Статья содержит код, который можно найти на GitHub project.
Иногда сталкиваешься с такой ситуацией, когда нужно использовать какой-нибудь сервис, представляющий собой spring bean, в экземпляре, который был создан в коде не spring контейнером, и соответственно, заинжектить обычным способом данный сервис не получится. В таком случае, можно получить нужный бин через контекст.
Например, сервис, который хотим использовать:
@Service
public class StringProcessorService {
public String toUpperCase(String str) {
return str.toUpperCase();
}
}
И класс, который использует данный сервис через контекст:
public class SimpleService {
private static StringProcessorService stringProcessorService = SpringUtility.getBean(StringProcessorService.class);
public String toUpperString(String str) {
return stringProcessorService.toUpperCase(str);
}
}
Получение бина из контекста для удобства реализовано через следующий утильный класс:
@Component
public class SpringUtility implements ApplicationContextAware {
private static ApplicationContext applicationContext;
public void setApplicationContext(ApplicationContext applicationContext) {
SpringUtility.applicationContext = applicationContext;
}
/**
* @param clazz bean class
* @param <T> bean type
* @return a class bean from the application context
*/
public static <T> T getBean(final Class<T> clazz) {
return SpringUtility.applicationContext.getBean(clazz);
}
}
Убедимся, что метод экземпляра работает корректно, запустив следующий тест:
@Test
void shouldCheckBeanCall() {
assertThat(new SimpleService().toUpperString("test")).isEqualTo("TEST");
}