Проблемы с экземплярами службы, помеченными как окончательные в контроллере весенней загрузки? - PullRequest
0 голосов
/ 25 марта 2020

Каковы проблемы с маркировкой экземпляра Spring-Service как финального в Spring-контроллере (пример кода ниже)?

Если все в пружине по умолчанию одноэлементное, это просто перебор? Также, если это уместно, аннотация @ autowired не используется.

@RestController
@RequestMapping("/controller")
public class MyController {
    private final MyService myService;

    ....
}

Ответы [ 2 ]

0 голосов
/ 25 марта 2020

Если мы попытаемся объявить поле @Autowired как окончательное, мы получим ошибку компиляции. Это само по себе раздражает, так как поле устанавливается в любом случае только один раз! Если вы также не аннотируете его как @Lazy, Spring попытается разрешить ваши зависимости как часть DAG во время запуска, и ваше поле может быть источником исключения BeanCurrentlyInCreationException из-за непредвиденных циклических зависимостей.

Вы можете использовать resol это с помощью Constructor Injection и определите зависимости как окончательные. Всякий раз, когда классу нужна новая зависимость, вы вынуждены добавить ее в параметры конструктора. Это, в свою очередь, заставляет вас узнавать по количеству сцеплений в нашем классе. Поскольку конечные поля могут быть инициализированы в конструкторе, наши зависимости могут быть неизменными - как и должно быть!

Внедрение в конструктор рекомендуется Spring. Пожалуйста, проверьте https://spring.io/blog/2007/07/11/setter-injection-versus-constructor-injection-and-the-use-of-required

0 голосов
/ 25 марта 2020

Рекомендуется делать переменные класса final , когда это возможно. Вот почему я предпочитаю использовать автоматическую разводку на основе конструктора:

...
private final MyService myService;

@Autowired
public MyClass(MyService myService){
  this.myService = myService;
}
...

Таким образом, все внедренные зависимости можно просматривать в одном месте (конструктор), и гарантируется, что все эти переменные инициализируются после того, как класс был создан.

Редактировать : Как уже упоминалось в комментариях, вам не нужна аннотация @Autowired для одного конструктора начиная с Spring 4.3

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