一、问题
控制台报错
“Parameter 7 of constructor in xxxxxxx required a bean of type 'java.lang.Integer' that could not be found.
Action:
Consider defining a bean of type 'java.lang.Integer' in your configuration.”
二、错误定位
@AllArgsConstructor
public class demo {
private IxService xService;
private IxDao xDao;
private IxxService xxService;
@Value("${x.xx}")
private Integer xx;
@Value("${x.xxx}")
private Integer xxx;
}
三、解决方式
去掉@AllArgsConstructor注释,代码如下:
public class demo {
@Autowired
private IxService xService;
@Autowired
private IxDao xDao;
@Autowired
private IxxService xxService;
@Value("${x.xx}")
private Integer xx;
@Value("${x.xxx}")
private Integer xxx;
}
四、错误原因
在类上加了@AllArgsConstructor注释的同时又引入了yml文件里配置的属性,该属性是有@Value的属性,两相冲突导致。
加@AllArgsConstructor的目的主要是为了多个属性可以自动构造函数注入,不用加很多@Autowired ,从而精简代码。
详解
@AllArgsConstructor 和 @Value 同时存在可能引发问题的原因是它们的执行顺序。这两个注解在Spring框架中会有不同的初始化时机。
- @AllArgsConstructor
这是Lombok库的一部分,它会在编译时生成一个构造函数,该构造函数包含所有类字段作为参数。这意味着@AllArgsConstructor 会在编译时生成构造函数,而不需要Spring的容器初始化。这个构造函数通常是在类加载时生成的。
- @Value
这是Spring框架的一个注解,用于从配置文件中读取属性值。它依赖于Spring的容器和生命周期,因此属性值需要在Spring容器初始化之后才能被注入。@Value 可以用来注入属性值,包括基本数据类型如 int 或 String,以及自定义的bean。
当这两个注解同时存在时,可能会出现问题,因为@AllArgsConstructor 生成的构造函数在类加载时可用,但Spring容器初始化的时机通常晚于类加载。这意味着在生成构造函数时,Spring容器可能还没有准备好,所以 @Value 无法正常工作。
五、其他
@NoArgsConstructor:生成无参的构造方法。
@AllArgsConstructor:生成该类下全部属性的构造方法。
@RequiredArgsConstructor:生成该类下被final修饰或者non-null字段生成一个构造方法。
场景
在springboot中,对于一个bean类,注入其他bean的时候,常见的是使用@Autowired,实际上也可以使用构造函数注入,这个时候就可以使用@AllArgsConstructor或者@RequiredArgsConstructor来代替。
✊码字不易,重新开始记录小bug,望大家多多支持,共勉!