spring xml配置中引用java配置不能用ClassPathXmlApplicationContext

现在的目的是想测试在xml配置中引用java配置的bean

CD唱片的接口:

package v4.c2;

public interface CompactDisc {

void play();

}

CD实现类:

package v4.c2;


public class SgtPeppers implements CompactDisc {

  private String title = "Sgt. Pepper's Lonely Hearts Club Band";  
  private String artist = "The Beatles";
  
  public void play() {
    System.out.println("Playing " + title + " by " + artist);
  }

}

播放器接口

package v4.c2;

public interface MediaPlayer {

  void play();

}

播放器实现类:

package v4.c2;
import org.springframework.beans.factory.annotation.Autowired;

public class CDPlayer implements MediaPlayer {
  private CompactDisc cd;

  @Autowired
  public CDPlayer(CompactDisc cd) {
    this.cd = cd;
  }

  public void play() {
    cd.play();
  }

}

CD配置类:

package v4.c2;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class CDConfig {
  @Bean
  public CompactDisc compactDisc() {
      System.out.println(2222);
    return new SgtPeppers();
  }
}

播放器的配置xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:c="http://www.springframework.org/schema/c"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean class="v4.c2.CDConfig" />

  <bean id="cdPlayer"
        class="v4.c2.CDPlayer"
        c:cd-ref="compactDisc" />
        
</beans>

注意这里就是在xml配置中引用java配置

<bean class="v4.c2.CDConfig" />

现在用ClassPathXmlApplicationContext测试

package v4.c2;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Boot {

    public static void main(String[] args) {
        ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("v4/c2/cdplayer-config.xml");
        MediaPlayer media = ac.getBean(MediaPlayer.class);
        media.play();
        ac.close();        
    }

}

报错:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'compactDisc' available

换成AnnotationConfigApplicationContext的方式,要添加一个根配置类:

package v4.c2;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;

@Configuration
@ImportResource("classpath:v4/c2/cdplayer-config.xml")
public class SoundSystemConfig {

}

这样测试:

package v4.c2;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Boot {

    public static void main(String[] args) {

        AnnotationConfigApplicationContext ac =new  AnnotationConfigApplicationContext(SoundSystemConfig.class);
        MediaPlayer media = ac.getBean(MediaPlayer.class);
        media.play();
        ac.close();        
    }

}

成功,输出:

2222
Playing Sgt. Pepper's Lonely Hearts Club Band by The Beatles

posted @ 2022-12-25 11:15  gongzz  阅读(124)  评论(0编辑  收藏  举报