当类是用外部引入的类时,难以在类中添加@Component标注,所以不能通过扫描标注来扫描,要在配置类中声明bean
CD抽象类和实现类AvrilCD,没有@Component标注
public interface CD {
void play();
}
public class AvrilCD implements CD {
public void play() {
System.out.println("AvrilCD");
}
}
MediaPlayer抽象类和实现类CDPlayer,AnotherCDPlayer
public interface MediaPlayer {
void playCD();
}
//@Component
public class CDPlayer implements MediaPlayer {
public CD cd;
//@Autowired//可以用在构造方法和方法中
public CDPlayer(CD cd) {
this.cd = cd;
}
public void playCD(){
cd.play();
}
}
public class AnotherCDPlayer implements MediaPlayer {
public CD cd;
public AnotherCDPlayer(CD cd) {
this.cd = cd;
}
public void playCD(){
cd.play();
}
}
配置类
/**
* 当类是用外部引入的类时,难以在类中添加@Component标注,所以不能通过扫描标注来扫描,要下面这样做
*/
@Configuration//作为配置文件
public class CDPlayerConfig {
@Bean
public CD avrilCD(){
return new AvrilCD();
}
@Bean
public MediaPlayer cdPlayer(){
return new CDPlayer(avrilCD());
}
@Bean
public MediaPlayer anotherCDPlayer(){
return new AnotherCDPlayer(avrilCD());
}
}
测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=CDPlayerConfig.class)
public class CDPlayerTest {
@Autowired//Autowired自动注入符合条件的bean,这个包下AvrilCD 符合
private CD cd;
@Autowired
private AnotherCDPlayer acdp;
@Autowired
private CDPlayer cdp;
//@Autowired
//private MediaPlayer mp;//报错,因为CDPlayer和AnotherCDPlayer 都实现了MediaPlayer,自动注入无法选择
@Test
public void cdShouldNotBeNull(){
assertNotNull(cd);
System.out.println(acdp.cd == cdp.cd);//即使在传参时自动装配CD,都new了对象,但是其实是用同一对象
//因为默认情况下,Spring的bean是单例的
cd.play();
}
}
结果:
true
AvrilCD