利用Java代码在某些时刻创建Spring上下文

上一篇中,描述了如何使用Spring隐式的创建bean,但当我们需要引进第三方类库添加到我们的逻辑上时,@Conponent与@Autowired是无法添加到类上的,这时,自动装配便不适用了,我们需要利用Java代码来显式实现bean

继上次的CD例程,两个接口,MediaPlayer/CompactDisc,其中MediaPlayer的实现为CDPlayer,CompactDisc的实现为CompactDisc_guangliang/CompactDisc_wangfei/CompactDisc_zhoujielun/CompactDisc_xusong。(之所以这么多是为了理解Spring的单次bean多次使用机制,通俗讲就是Spring为每一个bean只创建一个对象)代码可由上篇改动而来,这次去掉了创建注解与扫描注解。部分代码如下,其他实现与之类似:
package com.spring.javabeans.cd;

import org.springframework.beans.factory.annotation.Autowired;

public class CDPlayer implements MediaPlayer{
	private CompactDisc cd;
	
	@Autowired//表明Spring初始化后尽可能地去满足bean的依赖,在这里它注入了一个CompactDisc的对象
	public CDPlayer(CompactDisc cd){
		this.cd=cd;
	}
	@Override
	public void player() {
		System.out.println("使用CD播放!");
	}
}

 @Autowired只表明在调用构造器时Spring为其注入一个需要的bean

package com.spring.javabeans.cd;

public class CompactDisc_guangliang implements CompactDisc{
	private String title="童话";
	private String artist="光良";
	
	@Override
	public void play(){
		System.out.println("播放:"+title+"来自艺术家:"+artist);
	}
}

 去除了@Component之后,CompactDisc变成一个普通类,在这里,Spring不对其负责。

接下来写配置类。代码如下:
package com.spring.javabeans.cd;

import org.springframework.context.annotation.Bean;

//通过java代码定义spring的装配机制
public class CDPlayerConfig {
	@Bean
	public CompactDisc randomBeatlesCD(){
		int key=(int)Math.floor(Math.random()*4);
		if(key==0){
			return new CompactDisc_zhoujielun();
		}
		else if(key==1){
			return new CompactDisc_xusong();
		}
		else if(key==2){
			return new CompactDisc_guangliang();
		}
		else{
			return new CompactDisc_wangfei();
		}
	}
	
	@Bean
	public CDPlayer cdplayer(CompactDisc cd){
		return new CDPlayer(cd);
	}
}

 @bean表明了Spring需要在这里创建一个bean。

同样,我们用一个建一个JUnit4测试。代码如下:
package com.spring.javabeans.cd;

import static org.junit.Assert.*;
import org.junit.runner.RunWith;
import org.junit.Test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=CDPlayerConfig.class)
public class CDTest {
	@Autowired
	private MediaPlayer player;
	@Autowired
	private CompactDisc cd;
	@Test
	public void test1() {
		assertNotNull(player);
		assertNotNull(cd);
	}
	@Test
	public void test2(){
		player.player();
		cd.play();
	}

}

@Autowired表明了依赖注入关系。

 

 

热爱分享拒绝拿来主义,博客精神永存——cvrigo

2016-11-09 13:40:56

posted @ 2016-11-09 13:42  Vrigo  阅读(957)  评论(0编辑  收藏  举报