У меня есть проект с весенней загрузкой, который я смог успешно запустить на своем старом Mac под управлением Sierra. Недавно я купил новый Mac с Mojave, и когда я собираю проект spring-boot, я получаю NullpointerException при попытке использовать зависимость @Autowired.
Я убедился, что создаю проект с использованием оболочки gradle (версия 4.8) и что на обеих машинах установлена одна и та же версия java (1.8.0_60). Версия весенней загрузки, определенная в файле build.gradle, — 1.5.5.RELEASE.
Я понимаю, что между классами Foo и MyService существует круговая зависимость, но это никогда не было проблемой. В MyService должен быть введен Foo «до» вызова метода Foo init(), но, похоже, это не тот случай, когда я создаю и запускаю его на новом компьютере. Я предполагаю, что каким-то образом используется другая версия Spring, где правила внедрения зависимостей несколько отличаются.
@Component
public class Foo {
@Autowired
private MyService service;
@PostConstruct
private void init() {
service.doSomething();
}
public void bar() {}
}
@Component
public class MyService {
@Autowired
private Foo foo;
public void doSomething() {
foo.bar(); // <- NPE occurs here!
}
}
Спасибо, @Lazy был решением. Не знаю, почему это работало на старой машине.




Это определенно плохой знак, что у вас циклическая зависимость. Вы должны перепроектировать. Я проверял Сообщение блога, который охватывает эту тему, и в нем говорится следующее о циклических зависимостях:
When you have a circular dependency, it’s likely you have a design problem
and the responsibilities are not well separated. You should try to redesign
the components properly so their hierarchy is well designed and there is no
need for circular dependencies.
If you cannot redesign the components (there can be many possible reasons for
that: legacy code, code that has already been tested and cannot be modified,
not enough time or resources for a complete redesign…)...
Если вы все еще хотите оставить все как есть, вы можете проверить раздел 4.4. @PostConstruct о том, как они это делают, и черпать из этого вдохновение :).
Почему на одной машине работает, а на другой нет, для меня загадка.
Спасибо, раздел 4.2 решил эту проблему для меня (и подробно baeldung.com/spring-lazy-annotation). Мне нужно было убедиться, что я использую ленивые аннотации как в Autowired, так и в Component.
Чтобы избежать циклической зависимости, вы можете попросить контейнер лениво внедрить одну зависимость.