Spring @Value注入属性为null 无法读取application.properties配置
问题根因
你的判断完全准确。Spring 管理 Bean 的生命周期顺序为:先调用类的构造函数完成对象实例化,再执行@Value、@Autowired等标记的属性注入逻辑。你在构造函数中直接调用getKinesisProducer()初始化客户端时,awsAccessKey、awsSecretKey、awsRegion等配置属性还未完成注入,值均为null,因此触发access key cannot be null报错。
修复方法
以下两种方案都可以解决该问题,优先推荐第一种:
方案1:构造函数注入(Spring官方推荐写法)
将需要的配置参数通过构造函数传入,Spring会在调用构造函数前完成所有配置值的解析,从根源上避免初始化顺序问题,同时能保证依赖的不可变性。修改后的代码如下:
@Service public class ProducerServiceImpl extends ProducerService { private static final Logger LOG = LoggerFactory.getLogger(ProducerServiceImpl.class); private final String streamName; private final String awsRegion; private final String awsAccessKey; private final String awsSecretKey; private KinesisProducer kinesisProducer; public ProducerServiceImpl( @Value("${aws.stream_name}") String streamName, @Value("${aws.region}") String awsRegion, @Value("${aws.access_key}") String awsAccessKey, @Value("${aws.secret_key}") String awsSecretKey ) { this.streamName = streamName; this.awsRegion = awsRegion; this.awsAccessKey = awsAccessKey; this.awsSecretKey = awsSecretKey; // 此处所有配置值已完成注入,可安全初始化客户端 this.kinesisProducer = getKinesisProducer(); } private KinesisProducer getKinesisProducer() { if (kinesisProducer == null) { BasicAWSCredentials awsCreds = new BasicAWSCredentials(awsAccessKey, awsSecretKey); KinesisProducerConfiguration config = new KinesisProducerConfiguration(); config.setRegion(awsRegion); config.setCredentialsProvider(new AWSStaticCredentialsProvider(awsCreds)); config.setMaxConnections(1); config.setRequestTimeout(6000); config.setRecordMaxBufferedTime(5000); kinesisProducer = new KinesisProducer(config); } return kinesisProducer; } }
方案2:@PostConstruct 初始化
如果要保留字段注入的写法,不要在构造函数中执行客户端初始化,将初始化逻辑迁移到@PostConstruct标记的方法中即可——该方法属于Spring生命周期回调接口,会在所有属性注入完成后自动执行。
使用该方案需要做两处调整:
- 删除原有构造函数中
this.kinesisProducer = getKinesisProducer();的代码 - 新增初始化方法:
@PostConstruct private void initKinesisClient() { this.kinesisProducer = getKinesisProducer(); }
注意:使用该方案需要确保
ProducerServiceImpl类被Spring组件扫描识别,即类上需要标注@Service、@Component等注解,否则@Value、@PostConstruct注解都不会生效。
内容的提问来源于stack exchange,提问作者Shlok Sharma
相关产品推荐
相关产品推荐

