利用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
利用Java代码在某些时刻创建Spring上下文的更多相关文章
- jsp中利用java代码换行
从数据库中取出的10条商品数据分两行显示,每行5条. <% for(int i=0; i<latestProducts.size(); i++) { Product p = latestP ...
- Spring装配之——JAVA代码装配Bean
首先创建几个普通的JAVA对象,用于测试JAVA代码装配bean的功能. package soundsystemJava; //作为接口 定义了CD播放器对一盘CD所能进行的操作 public int ...
- 利用Java的反射与代理机制实现AOP
在上一篇文章中,我们讲述了利用Java的反射机制中实现Spring中的IOC,在本文中,我们将更进一步,讲述用Java的反射和动态代理机制来实现Spring的AOP. 一.AOP概述 AOP(Aspe ...
- 原型模式--java代码实现
原型模式 原型模式,属于对象创建型模式中的一种.通过复制原型对象的方法来创建一个对象实例,且该对象与原对象有相同的数据结构和值.类似我们在备份数据库信息的时候,将数据库中表的结构和数据的一同备份,生成 ...
- 从 Java 代码到 Java 堆
本文将为您提供 Java 代码内存使用情况的深入见解,包括将 int 值置入一个 Integer 对象的内存开销.对象委托的成本和不同集合类型的内存效率.您将了解到如何确定应用程序中的哪些位置效率低下 ...
- 对一致性Hash算法,Java代码实现的深入研究
一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...
- 从 Java 代码逆向工程生成 UML 类图和序列图
from:http://blog.itpub.net/14780914/viewspace-588975/ 本文面向于那些软件架构师,设计师和开发人员,他们想使用 IBM® Rational® Sof ...
- 通过Java代码浅谈HTTP协议
最近刚看了http协议,想写点东西加深一下理解,如果哪儿写错了,请指正. 1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(W ...
- 对一致性Hash算法,Java代码实现的深入研究(转)
转载:http://www.cnblogs.com/xrq730/p/5186728.html 一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读 ...
随机推荐
- Linux初识二
1. Linux上常用的文件管理命令及使用 (1) CP命令:复制文件或文件夹语法格式 cp [OPTION]... [-T] SOURCE DEST // 单源复制 cp [OPTION]... S ...
- php在5.5.0默认提供了Zend OPcache
eaccelerator无法兼容php5.5.0,好在php在5.5.0默认提供了Zend OPcache,所以一直习惯eaccelerator的朋友如果要升级到php5.5.0的话,可能要暂时和ea ...
- HTTP Method 之 Post VS. Get
引言 WebAPI 现在非常火的轻量服务框架,因其使用得使用了Http协议,并且具备了可协商内容(生成不同内容格式)等优势,所以在互联网业务中被广泛使用. 那作为HTTP最常用的两个方法Get和Pos ...
- 《明解c语言》已看完,练习代码此奉上
2016年9月20日至2016年11月12日,从学校图书馆借来的<明解c语言>看完了. 大三第一个学期,前8周,有c语言程序设计的课.课本是学校里的老师编写出版的,为了压缩空间,减少页面, ...
- [LeetCode] Find K Pairs with Smallest Sums 找和最小的K对数字
You are given two integer arrays nums1 and nums2 sorted in ascending order and an integer k. Define ...
- [LeetCode] Copy List with Random Pointer 拷贝带有随机指针的链表
A linked list is given such that each node contains an additional random pointer which could point t ...
- 用jQuery获取表单的值
在日常开发过程中,有许多用到表单的地方.比如登录,注册,比如支付,填写订单,比如后台管理等等. 使用jQuery来获取表单的值是比较常见的做法. 常见表单 单行文字域:<input type=' ...
- 上传和设置Mime类型
这两天一直在忙把主页上传的事,幸亏不久前花七块钱买了一年的数据库和虚拟主机,昨天上传了自己的个人主页,发现很多问题要改,因为代码一直没整理就那么放着了,大部分东西都要重新弄,然后把本地数据库的数据迁移 ...
- PHP 之道
http://wulijun.github.io/php-the-right-way/
- 学习vue.js 第一天
最近听到很多人都在用Vue.js ,我也想凑凑热闹,来个入门 啥的 ,要不以后人家说,啥都不知道,多low 看到官网 是这样介绍Vue.js Vue.js(读音 /vjuː/, 类似于 view) 是 ...