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

利用Java代码在某些时刻创建Spring上下文的更多相关文章

  1. jsp中利用java代码换行

    从数据库中取出的10条商品数据分两行显示,每行5条. <% for(int i=0; i<latestProducts.size(); i++) { Product p = latestP ...

  2. Spring装配之——JAVA代码装配Bean

    首先创建几个普通的JAVA对象,用于测试JAVA代码装配bean的功能. package soundsystemJava; //作为接口 定义了CD播放器对一盘CD所能进行的操作 public int ...

  3. 利用Java的反射与代理机制实现AOP

    在上一篇文章中,我们讲述了利用Java的反射机制中实现Spring中的IOC,在本文中,我们将更进一步,讲述用Java的反射和动态代理机制来实现Spring的AOP. 一.AOP概述 AOP(Aspe ...

  4. 原型模式--java代码实现

    原型模式 原型模式,属于对象创建型模式中的一种.通过复制原型对象的方法来创建一个对象实例,且该对象与原对象有相同的数据结构和值.类似我们在备份数据库信息的时候,将数据库中表的结构和数据的一同备份,生成 ...

  5. 从 Java 代码到 Java 堆

    本文将为您提供 Java 代码内存使用情况的深入见解,包括将 int 值置入一个 Integer 对象的内存开销.对象委托的成本和不同集合类型的内存效率.您将了解到如何确定应用程序中的哪些位置效率低下 ...

  6. 对一致性Hash算法,Java代码实现的深入研究

    一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...

  7. 从 Java 代码逆向工程生成 UML 类图和序列图

    from:http://blog.itpub.net/14780914/viewspace-588975/ 本文面向于那些软件架构师,设计师和开发人员,他们想使用 IBM® Rational® Sof ...

  8. 通过Java代码浅谈HTTP协议

    最近刚看了http协议,想写点东西加深一下理解,如果哪儿写错了,请指正. 1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(W ...

  9. 对一致性Hash算法,Java代码实现的深入研究(转)

    转载:http://www.cnblogs.com/xrq730/p/5186728.html 一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读 ...

随机推荐

  1. class.c 添加中文注释(3)

    int class_device_register(struct class_device *class_dev) { /* [cgw]: 初始化一个struct class_device */ cl ...

  2. Ubuntu Server 设置PPTP客户端连接

    安装PPTP客户端 apt-get install pptp-linux 设置连接账号信息 sudo vim /etc/ppp/chap-secrets 其中$login_name是登录名:$pass ...

  3. 【码在江湖】前端少侠的json故事(上)日月第一击

    日月第一击 这是我前端生涯第一次和后台对接,其经历真是苦不堪言,多次绝处逢生,柳暗花明,可就是迟迟见不到那条村子.当然,最后我还是完成了这次对接.下面来聊一聊我这白痴一般的经历. 序章 话说天下大势, ...

  4. Linux下安装nginx

    一直会使用nginx,也学习了好多nginx知识.也在本地安装过nginx,这次是第一次在正式的环境安装nginx,把这些记录下来总结经验. 一.安装环境 操作系统:CentOS release 6. ...

  5. 用 JSP 实现对文件的相关操作

    前段时间一直忙着作业,实验,动手的时间真是少之又少,今天终于可以继续和大家分享关于 JSP 的学习心得. 简单总结一下吧: JSP 理论性很强,感觉就是纯语法. 我更偏向于实际编写代码,这样更容易理解 ...

  6. BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]

    2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2545  Solved: 1419[Submit][Sta ...

  7. windows系统下fis3安装教程

    注意:在安装fis3前必须安装node和npm,详情请见官网http://nodejs.org node版本要求 0.8.x,0.10.x, 0.12.x,4.x,6.x,不在此列表中的版本不予支持. ...

  8. [LeetCode] Queue Reconstruction by Height 根据高度重建队列

    Suppose you have a random list of people standing in a queue. Each person is described by a pair of ...

  9. c#datagridview

    //保证显示当前活动单元格 this.Invoke(new Action(() => { dataGridView1.CurrentCell = dataGridView1.Rows[index ...

  10. 常用 Git 命令清单

    我每天使用 Git ,但是很多命令记不住. 一般来说,日常使用只要记住下图6个命令,就可以了.但是熟练使用,恐怕要记住60-100个命令. 下面是我整理的常用 Git 命令清单.几个专用名词的译名如下 ...