Лучшая практика для полей @Value, Lombok и Constructor Injection? - PullRequest
0 голосов
/ 14 сентября 2018

Я занимаюсь разработкой приложения Java Spring. У меня есть некоторые поля в моем приложении, которые настроены с помощью файла конфигурации .yml. Я хотел бы импортировать эти значения, используя аннотацию @Value для соответствующих полей. Я также хотел бы использовать лучшие практики внедрения конструкторов, а не полевые, но я хотел бы написать свой конструктор, используя Lombok, а не вручную. Есть ли способ сделать все это сразу? Например, это не работает, но похоже на то, что я хочу сделать:

@AllArgsConstructor
public class my service {
    @Value("${my.config.value}")
    private String myField;

    private Object myDependency;

    ...
}

В этом случае я хочу, чтобы Lombok сгенерировал конструктор, который устанавливает только myDependency, и чтобы myField мог быть прочитан из моего файла конфигурации.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Я использовал предложение Хрилис в комментарии к ОП, и оно сработало.

0 голосов
/ 14 сентября 2018

Вам нужно @RequiredArgsConstructor и пометить myDependency как окончательное.В этом случае Lombok сгенерирует конструктор на основе «обязательного» окончательного файла, заданного в качестве аргумента, например:

@RequiredArgsConstructor
@Service
public class MyService {

    @Value("${my.config.value}")
    private String myField;

    private final MyComponent myComponent;

    //...
}

Это равно следующему:

@Service
public class MyService {

    @Value("${my.config.value}")
    private String myField;

    private final MyComponent myComponent;

    public MyService(MyComponent myComponent) { // <= implicit injection
        this.myComponent = myComponent;
    } 

    //...
}

Так как здесь толькоодин конструктор, Spring inject MyComponent без явного использования аннотации @Autowired .

...