Внедрение в конструктор с использованием аннотаций - PullRequest
0 голосов
/ 05 мая 2018

Почему мой код не работает с приведенной ниже ошибкой, когда я AUTOWIRE конструктор no arg, но он работает нормально, когда я автоматически подключаю только один конструктор arg

Исключение в потоке "main" java.lang.NullPointerException

Вот фрагмент кода TennisCoach Class

@Component // this is bean id 
public class TennisCoach implements Coach {

    public TennisCoach(FortuneService thefortuneservice) {
        System.out.println(" inside 1 arg  constructter");
        fortuneservice = thefortuneservice;
    }


    @Autowired
    public TennisCoach() {
        System.out.println(" inside  0 arg constructter");

    }
}

Coach theCoach = myapp.getBean("tennisCoach", Coach.class);
System.out.println(theCoach.getDailyFortunes());

Как все работает за сценой?

Ответы [ 3 ]

0 голосов
/ 05 мая 2018

Конструктор без аргументов не хочет, чтобы вы добавляли в него @Autowired, поскольку вы ничего не вводите в его аргументы (так как их нет). Однако @Autowired требуется для конструктора с аргументами.

@ Аннотация компонента над классом создаст ваш компонент с помощью вызова конструктора по умолчанию, и вы можете использовать его где угодно, но вам нужно убедиться, что вы ничего не вызываете в fortuneservice, так как это приведет к исключению null ptr, если только вы инициализировать это. Напротив, если вы помещаете аннотацию @Autowired поверх конструктора с аргументом, и он работает нормально, это означает, что bean-компонент fortuneservice, который вы объявили в другом месте, теперь будет внедрен внутри этого класса, и не будет исключение null ptr, если вы вызываете какой-то метод в что.

0 голосов
/ 05 мая 2018

Добавляя к предыдущим ответам - подумайте над термином «инжектор конструктора». Вы вводите ссылки через параметры конструктора. Когда вы @Autowire пустой конструктор, вводить нечего. Поэтому вы получаете NullPointerException при попытке получить доступ к полю, в которое должна была быть вставлена ​​ссылка.

0 голосов
/ 05 мая 2018

Если у вас есть только один конструктор в классе, вам не нужно использовать @Autowired - Spring понимает, что есть только одна опция, поэтому он использует ее. Но у вас есть два конструктора, поэтому вам нужно указать Spring, какой из них использовать.

Однако, когда вы вызываете конструктор по умолчанию, что вы ожидаете, что произойдет? Вы нигде не настраиваете свои переменные, но пытаетесь прочитать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...