Применение бинов в неуправляемых экземплярах

Статья содержит код, который можно найти на 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");
}