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

260
26 ноября 2016, 19:11

Никак не могу разобраться с тем, как работает аннотация @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.

Answer 1

"Магия" аннотаций 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, т.к. этот код лежит за пределами контекста приложения.

READ ALSO
Как отследить, что приложение на андроид было свернуто?

Как отследить, что приложение на андроид было свернуто?

Нужно, чтобы при сворачивании приложения оно закрывалось

296
Как исправить значение в switch

Как исправить значение в switch

Слова в кавычках ("apple", "bread", "cheese") подчеркнута красной волнистой линией! Как исправить?

241
Java. Фибоначчи

Java. Фибоначчи

Здравствуйте, подскажите пожалуйстаИмеется работоспособный код, который выводит числа Фибоначчи:

163
Загрузка изображений c интернета на SD карту Android

Загрузка изображений c интернета на SD карту Android

Стоит задача скачать изображения с сайта, создать их файлы на SD карте и поместить в базу пути к нимДля последующего вызова их без подключение...

288