I'm developing a Java Spring application. I have some fields in my application which are configured using a .yml config file. I would like to import those values using an @Value annotation on the fields in question. I would also like to use the best-practice of constructor injection rather than field injection, but I would like to write my constructor using Lombok rather than manually. Is there any way to do all these things at once? As an example, this doesn't work but is similar to what I want to do:
@AllArgsConstructor
public class my service {
@Value("${my.config.value}")
private String myField;
private Object myDependency;
...
}
In this case, what I want is Lombok to generate a constructor which sets only myDependency, and for myField to be read from my config file.
Thanks!
You need @RequiredArgsConstructor
and mark myDependency
as final. In this case, Lombok will generate a constructor based on 'required' final filed as argument, for example:
@RequiredArgsConstructor
@Service
public class MyService {
@Value("${my.config.value}")
private String myField;
private final MyComponent myComponent;
//...
}
That is equal the following:
@Service
public class MyService {
@Value("${my.config.value}")
private String myField;
private final MyComponent myComponent;
public MyService(MyComponent myComponent) { // <= implicit injection
this.myComponent = myComponent;
}
//...
}
Since here is only one constructor, Spring inject MyComponent
without the explicit use of the @Autowired
annotation.