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
相关产品推荐
相关产品推荐

