Spring実戦——手動組立bean


クラスが外部から導入されたクラスの場合、クラスに@Componentの表示を追加するのは難しいので、スキャン表示でスキャンすることはできません。
 
CDの抽象類と実現類のAvrilCDは、@Componentの表示がありません。
public interface CD {
    void play();
}
public class AvrilCD implements CD {

    public void play() {
        System.out.println("AvrilCD");
    }
}
MediaPlayer抽象類と実現類CDPlayer、Another CDPlayer 
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 Avril CD