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

Spring如何通过Java注解注入其他Bean的List/数组到Bean参数?

解决Spring注解方式注入List到MusicPlayer的问题

核心原理

Spring会自动扫描并收集所有类型为Music的Bean,将它们自动注入到List<Music>类型的依赖中,不需要手动创建名为theList的Bean。

方案一:构造函数注入(推荐)

这是Spring官方推荐的依赖注入方式,更利于测试和依赖可见性。修正后的代码如下:

package org;
import org.music.Music;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.List;

@Component("musicPlayer")
@Scope("prototype")
public class MusicPlayer {
    private final List<Music> musicList;
    @Value("${musicPlayer.name}")
    private String name;
    @Value("${musicPlayer.volume}")
    private int volume;

    // Spring会自动将所有Music类型的Bean注入到这个List参数中
    public MusicPlayer(List<Music> musicList) {
        this.musicList = musicList;
    }

    public String getName() {
        return name;
    }

    public int getVolume() {
        return volume;
    }

    public void playMusic() {
        for (Music music : musicList) {
            System.out.println("Playing: " + music.getSong());
        }
    }

    @PostConstruct
    public void doMyInit() {
        System.out.println("Open Stream");
    }

    // 注意:prototype作用域的Bean,Spring不会调用@PreDestroy方法,容器不管理其销毁生命周期
    // public void doMyDestroy() {
    //     System.out.println("Close Stream");
    // }
}

方案二:字段注入(简化写法)

如果不想用构造函数,也可以直接用@Autowired或@Resource注入字段,无需指定name:

package org;
import org.music.Music;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.List;

@Component("musicPlayer")
@Scope("prototype")
public class MusicPlayer {
    @Autowired // 或者用@Resource,无需指定name
    private List<Music> musicList;
    @Value("${musicPlayer.name}")
    private String name;
    @Value("${musicPlayer.volume}")
    private int volume;

    // 可以保留无参构造,或者不写(Spring会默认生成)
    public MusicPlayer() {}

    // 其他方法与方案一一致...
}

注意事项

  • 确保所有Music的实现类都标注了@Component(或@Service、@Repository等Spring stereotype注解),这样Spring才能扫描到这些Bean并收集到List中。
  • 对于prototype作用域的Bean,Spring仅负责创建实例,不会管理其销毁逻辑,@PreDestroy注解不会生效,若需要销毁操作需手动调用。

内容的提问来源于stack exchange,提问作者Art

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 00:36:27