在某次操作中,我想给组件加载时添加一点功能,这个应该在无参构造器中实现,但我去调用其中一个属性时却报了空指针异常。很诧异,这个属性已经使用自动注入注解了,他怎么能是个空呢?
做个测试
在Application.yml配置文件中先给一个初始值
sal:
empNo: 100
测试类如下,是用MyBatis-plus生成的
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("sal")
@ConfigurationProperties(prefix = "sal")
@Component
public class Sal implements Serializable {
private static final long serialVersionUID = 1L;
private Integer empNo;
private BigDecimal sal;
public Sal(){
System.out.println(empNo+"-------------");
}
}
的确,在控制台我确实得到了null---------
那看来是先加载对象在注入属性咯
后来我发现,确实如此
这是Field类中的set方法源码
@CallerSensitive
/*第一个参数是反射目标的实例,第二个是要设置的值
也就是说在调用此方法前我必须拥有一个该目标的实例才能为其中
的属性赋值,逻辑上说的通,属性在反射的目标类中,所以我得先确定是哪个实例才能对其中的属性赋值*/
public void set(Object obj, Object value)
throws IllegalArgumentException, IllegalAccessException
{
if (!override) {
if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
Class<?> caller = Reflection.getCallerClass();
checkAccess(caller, clazz, obj, modifiers);
}
}
getFieldAccessor(obj).set(obj, value);
}
本文仅代表个人理解,有误的地方请各位看官指出(你说了我也不听)
牛哔