默认情况下,Spring中的bean都是单例 的 , 也就是说,由Spring管理的bean一旦被创建了,即使有很多其他的bean都依赖这个bean,Spring始终会把这个bean注入到与他相互依赖的bean中去。
代码:
@Component
public class SgtPeppers implements CompactDisc {
private Stringtitle ="My title";
private Stringartist ="My artist";
public SgtPeppers(){
System.out.println("初始化SgtPeppers "+this.hashCode());
}
@Override
public void play() {
System.out.println("title "+title+","+"artist "+artist);
}
}
@Component
public class CDPlayer implements MediaPlayer {
private CompactDisc cd;
@Autowired
public CDPlayer(CompactDisc cd) {
System.out.println("MediaPlayer 的属性cd "+cd.hashCode());
this.cd = cd;
}
@Override
public void play() {
cd.play();
}
}
测试:
@RunWith(SpringJUnit4ClassRunner.class)//
@ContextConfiguration(classes = CDPlayerConfig.class)//加载配置
public class CDPlayerTest {
@Autowired
private MediaPlayer mediaPlayer;
@Autowired
private CompactDisc cd;
// @Test
// public void cdShouldNotBeNull(){
// assertNotNull(cd);
// cd.play();
// }
@Test
public void play(){
mediaPlayer.play();
assertEquals("log:",log.getLog());
}
}
测试结果:
初始化SgtPeppers 1272123492
MediaPlayer 的属性cd 1272123492
可以看到 CDPlayer 构造器中的参数cd和测试类CDPlayerTest中mediaPlayer的cd属性的hashCode相同,说明Spring始终为这些依赖的bean注入同一个实例,而不会在去创建另一个相同的实例对象。
网友评论