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

来源:互联网 时间:2016-11-09

上一篇中,描述了如何使用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;}@Overridepublic 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="光良";@Overridepublic 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 {@Beanpublic 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();}}@Beanpublic 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 {@Autowiredprivate MediaPlayer player;@Autowiredprivate CompactDisc cd;@Testpublic void test1() {assertNotNull(player);assertNotNull(cd);}@Testpublic void test2(){player.player();cd.play();}

}

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

 

 

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

2016-11-09 13:40:56

相关阅读:
Top