You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 05:33:02