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

时间:2023-12-05 19:55:26

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