Spring中@Autowired注入的Bean如何用于类成员变量初始化?
问题根本原因
你遇到的空指针确实是依赖注入时机和类实例化顺序不匹配导致的:
Java类的实例化流程优先级为:对象内存分配 -> 实例变量初始化赋值 -> 构造方法执行,而@Autowired字段注入是Spring在对象实例化完成后,通过反射给字段赋值的,所以你在声明bList时直接初始化的阶段,b还没有完成注入,值为null,自然会抛出空指针。
可行解决方案
方案1:使用构造器注入(最推荐)
Spring 4.3+ 版本对于单构造器的Bean会自动注入构造参数,构造参数在对象实例化时就会被Spring传入,完全匹配初始化顺序,还可以将字段声明为final保证不可变性:
import com.google.common.collect.ImmutableList; import org.springframework.stereotype.Component; import java.util.List; @Component public class A { private final B b; private final List<B> bList; public A(B b) { this.b = b; this.bList = ImmutableList.of(b); } }
方案2:使用@PostConstruct初始化
在所有依赖注入完成后,Spring会自动执行标注了@PostConstruct的方法,适合不想修改构造逻辑的场景:
import com.google.common.collect.ImmutableList; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import jakarta.annotation.PostConstruct; // Spring Boot 2.x及更早版本使用 javax.annotation.PostConstruct import java.util.List; @Component public class A { @Autowired private B b; private List<B> bList; @PostConstruct private void initBList() { bList = ImmutableList.of(b); } }
方案3:实现InitializingBean接口(侵入性较高)
实现Spring提供的InitializingBean接口,重写afterPropertiesSet方法,效果和@PostConstruct一致:
import com.google.common.collect.ImmutableList; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.List; @Component public class A implements InitializingBean { @Autowired private B b; private List<B> bList; @Override public void afterPropertiesSet() { bList = ImmutableList.of(b); } }
内容的提问来源于stack exchange,提问作者Arpit Krishna
相关产品推荐
相关产品推荐

