给一个A对象,有两个属性name和age,分别用构造函数和注解@Value注入值。
使用lombok的@AllArgsConstructor注解可以自动生成带所有属性的构造函数,如下:
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class A {
private String name;
private int age;
}
这样,在实例化A类时就可以直接传入name和age的值了:
A a = new A("Tom", 20);
但是,如果同时使用Spring的@Value注解,则可能会出现无法注入值的情况。
例如,给A类添加一个不带参的构造函数,并在属性上使用@Value注解:
import org.springframework.beans.factory.annotation.Value;
public class A {
private String name;
@Value("${age}")
private int age;
public A() {
}
public A(String name, int age) {
this.name = name;
this.age = age;
}
}
在Spring容器中配置属性值(例如在application.properties中配置age=18),并使用Spring的注入方式进行实例化:
@Autowired
private A a;
但是发现此时a对象的age属性值为0,即没有注入成功。这是因为@AllArgsConstructor会把原来的不带参的构造函数覆盖掉,导致Spring没法找到符合的构造函数进行注入。解决方法是使用@RequiredArgsConstructor代替@AllArgsConstructor,这样就会保留不带参的构造函数用于Spring注入。
总结:
-
使用lombok的@AllArgsConstructor注解可以自动生成带所有属性的构造函数,方便对象实例化。
-
但是在使用Spring的@Value注解时,要注意@AllArgsConstructor可能会覆盖原来的不带参的构造函数,导致Spring无法注入属性值。
-
解决方法是使用@RequiredArgsConstructor代替@AllArgsConstructor,保留不带参的构造函数用于Spring注入。
以上就是此问题的解决方法,希望对大家有所帮助。