虽然在大多数场景中使用Spring的隐式发现bean和自动装配更加的便利。但在某些场景中,比如要将第三方组件添加到你的应用中时,不能再第三方组件的所有类上添加@Component和@Autowried。这个时候我们就需要显示装配了。Spring的显示装配有两种:
1. 通过java显示装配。
2. 通过Xml显示装配。
下面详细说一下通过java如何显示装配bean,以及如何满足bean之间的依赖关系(DI)。
首先我们创建CD接口以及CD接口的实现类:
package com.zwq.javazhuangpei;
public interface CompactDisc {
void play();
}
CD接口
package com.zwq.javazhuangpei;
import org.springframework.stereotype.Component;
public class ZjlPeppers implements CompactDisc{
private String title="周杰伦的歌";
private String artist="Cd碟";
@Override
public void play() {
System.out.println("Playing:"+title+" By"+artist);
}
}
然后创建播放器接口和播放器接口的实现类:
package com.zwq.javazhuangpei;
public interface MediaPlayer {
public void play();
}
播放器接口
package com.zwq.javazhuangpei;
public class CdPlayer implements MediaPlayer{
private CompactDisc cd;
public CdPlayer(CompactDisc cd){
this.cd=cd;
}
public void play(){
cd.play();
}
public void setCd(CompactDisc cd) {
this.cd = cd;
}
}
播放器接口的实现类
最后需要创建配置类来实现bean的创建以及满足bean之间的依赖关系
package com.zwq.javazhuangpei;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
* 这是一个配置类
* @author 21953
*
*/
@Configuration
public class CDPlayerConfig {
@Bean
public CompactDisc zjlPeppers(){
return new ZjlPeppers();
}
}
**在这个配置类中用了两个注解@Configuration和@Bean。@Configuration表名这个类是一个配置类,在这个类中应该包含在Spring应用上下文中创建bean的细节。@Bean注解告诉Spring这个方法会返回一个对象,这个对象会被作为bean注册进Spring应用上下文中。这个bean的id就是方法名,在这里bean的名字是zjlPeppers。如果想用别名的话可以使用@Bean注解的name属性,如@Bean(name=“名字”)。可以看到在用java配置Spring时,申明一个bean也是非常简单的。接下来,要满足bean之间的依赖关系。在这个例子中,播放器依赖于cd碟。所以接下来需要在这个配置类中再声明一个播放器的bean,并将cd碟的bean注入进去。**代码如下:
package com.zwq.javazhuangpei;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
* 这是一个配置类
* @author 21953
*
*/
@Configuration
public class CDPlayerConfig {
@Bean
public CompactDisc zjlPeppers(){
return new ZjlPeppers();
}
@Bean
public MediaPlayer cdPlayer(){
return new CdPlayer(zjlPeppers());
}
}
在这段代码中新声明了一个播放器的bean,cdPlayer()方法与zjlPeppers()有点区别。在cdPlayer()中调用需要传入CompactDisc 对象的构造器来创建cdPlayer实例。在这里通过调用方法名来引入bean来实现构造器注入。在实现构造器注入还有另外一种方式:
@Bean
public MediaPlayer cdPlayer(CompactDisc cd){
return new CdPlayer(cd);
}
这种方式是引用其他bean的比较好的选择,因为他没有要求将CompactDisc 申明到同一个配置类中。可以通过组件扫描或者通过Xml来进行配置这个bean。不管CompactDisc 是通过什么方法创建出来,Spring都会将其传入到配置方法中。用来创建cdplayer的bean。
如果要通过set方法注入,代码就是这样的:
@Bean
public MediaPlayer cdPlayer(CompactDisc cd){
CdPlayer cp=new CdPlayer(cd);
cp.setCd(cd);
return cp;
}
说明一下,带有@Bean注解的方法可以采用任何必要的java功能来产生bean实例。构造器和Setter只是@Bean方法的两个简单样例,这里存在的可能性仅受java语言的限制。
测试一下是否装配成功:
package com.zwq.javazhuangpei;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class test {
public static void main(String[] args) {
ApplicationContext context=new AnnotationConfigApplicationContext(CDPlayerConfig.class);
CdPlayer cp=(CdPlayer) context.getBean("cdPlayer");
cp.play();
}
}
运行结果: