Lombok и аннотация @Autowired
Добавил в проект библиотеку Lombok.
Дело в том, что я обычно иньектю спринг бины через @Autowired над сеттерами или конструктором. Вроде бы как это безопаснее, чем над полями из-за возможных циклических зависимостей.
Но переведя проект на Lombok, использую аннотацию @Data, соответственно геттеров/сеттеров не видно. И не понятно как авто инжектить бины с помощью @Autowired. Над чем её ставить? Или как заинжектить без этой аннотации?
Ответы (2 шт):
Циклические зависимости - признак плохого дизайна, избавьтесь от них. Лучше всего внедрять зависимости через конструктор.
Если внедрение по типу годится, то ничего дополнительно делать не нужно (для stateless бинов используйте @Value, для остальных - @Data) - конструктор сгенерированный lombok будет работать, а spring внедрит зависимости сам.
Пример, как должен выглядеть сервис:
@Value
public SomeService {
AnotherService anotherService;
YetAnotherService yetAnotherService;
public void someMethod () {
anotherService.call();
}
}
@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