Lombok и аннотация @Autowired

Добавил в проект библиотеку Lombok.

Дело в том, что я обычно иньектю спринг бины через @Autowired над сеттерами или конструктором. Вроде бы как это безопаснее, чем над полями из-за возможных циклических зависимостей.

Но переведя проект на Lombok, использую аннотацию @Data, соответственно геттеров/сеттеров не видно. И не понятно как авто инжектить бины с помощью @Autowired. Над чем её ставить? Или как заинжектить без этой аннотации?


Ответы (2 шт):

Автор решения: Roman Konoval

Циклические зависимости - признак плохого дизайна, избавьтесь от них. Лучше всего внедрять зависимости через конструктор.

Если внедрение по типу годится, то ничего дополнительно делать не нужно (для stateless бинов используйте @Value, для остальных - @Data) - конструктор сгенерированный lombok будет работать, а spring внедрит зависимости сам.

Пример, как должен выглядеть сервис:

@Value
public SomeService {
  AnotherService anotherService;
  YetAnotherService yetAnotherService;

  public void someMethod () {
     anotherService.call();
  }
}
→ Ссылка
Автор решения: Sergey Mitrofanov

@Value и @Data скорее про POJO, Entity и идемпотентность. Чаще под бинами, которые еще и @Autowired имеют в виду @Service, @Repository, @Component и их производные.

Достаточно объявить переменную инъектируемого бина как pivate final и использовать аннотацию Lombok @RequiredArgsConstructor.

Вот пример для абстрактного User в вакууме.

@Data
@Entity
public class User {
  //
}

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
  //
}

@Service
@RequiredArgsConstructor
public class UserService {
  private final UserRepository;
  //
}

@RestController
@RequiredArgsConstructor
public class UserController {
  private final UserService;
  //
}

UserRepository -> UserService -> UserController

→ Ссылка