Spring实战——手动装配 bean

 当类是用外部引入的类时,难以在类中添加@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

你可能感兴趣的:(java,spring)