Я недавно стажировался в интернет-компании и столкнулся с необходимостью самостоятельно разработать sdk. Опираясь на свой предыдущий проектный опыт, я сначала создал проект Maven, затем представил зависимости Spring, а затем начал сумасшедший вывод.Когда я закончил писать установку и запустить демонстрационный тест, сумасшедший NPE (NullPointerException) был перегружен.Моя последняя строка защиты.
Далее я дам вам представление о том, что я сделал не так, и воспроизведу сцену того времени. Надеюсь, вы сможете черпать из него вдохновение. Эммм, на самом деле, в общем, не паникуйте, когда сталкиваетесь с проблемами.Проверьте конфигурацию Spring
Когда вы обнаружите, что значение свойства в бизнес-компоненте равно нулю после внедрения через @Autowired или @Resource, я думаю, что ваша первая реакция невероятна (PS: Я, Боже 🐎 Призрак? С моим кодом проблем нет, должны быть другие причины). В этой ситуации, не паникуйте, перед лицом WeChat, лучший способ страха обслуживания клиентов состоит в том, чтобы преодолеть страх, Олли даст это.
На самом деле, никто не хочет, чтобы такая проблема случилась.Раз она возникла, то я предлагаю вам проверить вашу конфигурацию Spring, прежде чем думать о том, как убежать.В конце концов, если есть даже проблема с конфигурацией, то Spring - это фея.Правильный способ помочь нам завершить работу по сборке Бина.Конкретные моменты для проверки следующие:
- над вашим компонентомБыли ли добавлены соответствующие аннотации. Например: @Controller, @Service, @Repository, @Component и т. д. (PS: Что, без настройки и без аннотаций, что вы хотите?)
- Убедитесь, что указан правильный путь к конфигурации сканера контекстного сканирования. То есть, может ли ваш сканер пакетов сканировать ваши компоненты аннотаций. (Если вы являетесь пользователем SpringBoot, проверьте, находится ли ваш пакет в том же каталоге, что и основная программа входа, и проверьте правильность пути, настроенного @ComponentScan)
С помощью вышеуказанных проверок мы должны сначала убедиться, что наши компоненты могут быть доставлены в контейнер Spring для унифицированного управления.
Проверьте способ создания экземпляра
Это тоже распространенная ошибка многих новичков.Я ввел все внутренние свойства.Почему я создаю новый объект и значения свойств в нем все нулевые?Это совсем не радует. Эта проблема возникает в основном из-за неправильного способа получения объекта. Мы знаем, что Spring — это bean-контейнер, а контейнер отвечает за инициализацию объекта и внедрение зависимостей. Когда мы хотим получить экземпляр компонента из него, мы должны получить его из контейнера Spring. Например: new ClassPathXmlApplicationContext("classpth:applicationContext.xml").getBean(String beanName); Или мы должны полагаться на аннотации, и Spring поможет нам внедрить зависимости. И если мы создаем новый экземпляр класса, мы обходим процесс внедрения зависимостей контейнера, поэтому может случиться так, что мы не сможем получить правильные атрибуты. (Твои вещи сделаны не чужим трудом, а ты идешь на чужие фабрики и говоришь, что им не хватает только двух, а тебя, братец, могут забить до смерти.)
Проверьте место инъекции
Когда арендодатель пишет код, первой сценой, где инъекция пуста, является добавление аннотации @Autowired к статическому свойству. Почесывание моих ушей и щек в то время еще свежо в моей памяти, но, успокоившись и хорошенько обдумав это, я смог увидеть, что произошло. Spring помогает нам автоматически вводить свойства после помощи в создании экземпляра Bean. Статический атрибут указывает, что атрибут принадлежит классу, а не экземпляру. Другими словами, когда мы хотим внедрить значения в статические свойства, объект еще не создан. Следовательно, должна быть ситуация, когда впрыск пуст.
Проблемы из-за порядка инициализации бина
Эта ситуация является реальной возможностью в бизнесе, и об этом нелегко думать. Сценарий, с которым сталкивается арендодатель, заключается в реализации фильтра, в котором необходимо внедрить компоненты бизнес-уровня для реализации некоторой логики фильтрации. После написания кода я обнаружил, что ServerBean всегда был пуст, и я проверил все возможные проблемы в трех вышеперечисленных методах и не решил их. Немного погуглив, я был ошеломлен. Получается, что веб-контейнер запускается в определенном порядке, а именно: Listener --> Filter --> Servlet. Наш компонент службы создается с опорой на компонент контроллера сервлета, поэтому при создании экземпляра фильтра зависимость не может быть внедрена, поскольку экземпляр сервлета не был инициализирован.
В общем, когда в наших проектах возникают подобные проблемы, не нужно слишком нервничать. Просто успокойтесь и хорошенько подумайте над тем, чему вы научились, чтобы получить желаемую обратную связь. Надеюсь, что смогу вам помочь.