上一篇中,描述了如何使用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