虽然在大多数场景中使用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();
	}
}

运行结果:

java 装配类 java装配模式_构造器