Страницы

Поиск по вопросам

вторник, 9 июля 2019 г.

Null Pointer Exception Аннотация @Autowired Spring

Никак не могу разобраться с тем, как работает аннотация @Autowired в Spring. Итак, допустим, у меня есть вот такой интерфейс Interface1:
public interface Interface1 { String getString(); }
У него есть всего один метод. Следующий класс, являющийся @Service, реализует этот простой интерфейс:
@Service public class Interface1Impl implements Interface1 { public String getString() { return "Hello!"; } }
Теперь я хочу использовать где-то экземпляр этого класса вместе с аннотацией @Autowired. Создаю вот такой вот класс Instance1:
@Service public class Instance1 {
@Autowired Interface1 field;
public void doSomething() { System.out.println(field.getString()); } }
Далее в методе main своего главного класса я делаю следующее:
public class MainClass { public static void main(String[] args) { Instance1 instance = new Instance1(); instance.doSomething(); } }
Однако появляется NullPointerException из-за того, что field с аннотацией @Autowired остался без присвоенного значения. Я не понимаю, почему так, и в целом плохо понимаю, как в данной ситуации работает Spring. Пожалуйста, объясните мне, как можно исправить код, чтобы в методе main я смог вызывать методы instance.


Ответ

"Магия" аннотаций Spring работает только внутри контекста Spring. Который вам нужно создать. Вот некоторое приближение того, что вы пытаетесь сделать в main
@Configuration @ComponentScan(basePackages = "your.package") public class MainClass { public static void main(String[] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext(MainClass.class); Instance1 inst = ctx.getBean(Instance1.class); inst.doSomething(); } }
Но в Spring-приложениях впринципе не принято делать никакую логику в main, кроме какой-то базовой инициализации самого Spring, т.к. этот код лежит за пределами контекста приложения.

Комментариев нет:

Отправить комментарий