利用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
支持原创,支持转载,拒绝抄袭