Никак не могу разобраться с тем, как работает аннотация @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, т.к. этот код лежит за пределами контекста приложения.
Комментариев нет:
Отправить комментарий