Spring实战——手动装配 bean

在遇到无法使用@Component注解的类时,如CD抽象类和其实现AvrilCD,以及MediaPlayer的实现类CDPlayer和AnotherCDPlayer,需要在Spring配置类中手动声明Bean。本文将详细介绍这一过程,并通过测试展示配置的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值