系统学习Spring之Spring in action(一)
废话两 句,以前也看过Spring in action,那时候只能草草的看看,没有仔细阅读,如今在读Spring in action 是想发奋图强,几个月后就要结婚了,也许会在今年会要宝宝,为了给宝宝一个更好的生活环境,为了做一个好爸爸,我从现在开始努力的工作,努力的学习,我想 在博客园中留下我的奋斗足迹,同时也鞭策自己,不要放弃自己的初衷。
--2013-03-18 刘帅 写于南京
----------------------------以上内容纯属战前动-------------------------
文章导读:
Spring框架的核心是Spring Container,Spring有多种Spring Container的实现,但归根结底分为两类:
1.BeanFactory创建最简单的Spring Container提供最基本的DI(Dependency Injection)和bean-wiring服务.
2.ApplicationContext创建的SpringContainer提供更多的高级框架服务.
在这篇文章中和以后的文章中,我会把主要的精力放在ApplicationContext创建的SpringContainer上,在以后的文章中不在赘述.
Wiring Beans
1.首先创建一个玩家接口方便后面使用.
public interface Player { public void play(); }
2.创建一个Dota玩家类,继承自玩家类
public class DotaPlayer implements Player { //已杀敌人总数 private int currentKill = 0; //没有参数的构造方法 public DotaPlayer(){}
//以基本类型为参数的构造方法 public DotaPlayer(int currentKill){ this.currentKill = currentKill; }; //重写Player类中的play()方法 @Override public void play() { // TODO Auto-generated method stub System.out.println("DOTA玩家已经杀了"+ this.currentKill +"个敌人."); } }
3.类创建好了,下面用Spring配置文件来配置这个类,为实例化这个类做准备.
<bean id="dotaPlayer" class="com.ricky.zero.pojo.DotaPlayer"></bean>
其中com.ricky.zero.pojo是创建DotaPlayer的包名,DotaPlayer是类名,到这里Spring Configuration已经配置完成,下面让我们来实例化这个DotaPlayer玩家类.
4.实例化DotaPlayer类.
public class DITest { //用Spring的DI(依赖注入)实例化第一个Pojo类. @Test public void DITest1(){ //当Spring container 加载Spring配置文件后,<beans></beans>标签下的所有<bean></bean>将会被实例化. ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml"); DotaPlayer dotaPlayer = (DotaPlayer)ctx.getBean("dotaPlayer"); dotaPlayer.play(); } }
5.运行Test后结果如下:
DOTA玩家已经杀了0个敌人.
说明DotaPlayer类已经被实例化成功.到此,恭喜你完成了学习Spring的第一步,实例化一个Pojo类.
1.其实在上文中,我已经在使用构造器来实例化类了,在上文的DotaPlayer类中,我创建了两个构造方法,一个是没有参数的构造方法,一个是 有参数的构造方法,在注入DotaPlayer对象中默认调用了它的无参构造方法,若删除上文的无参构造方法,只保留有参的构造方法则会抛以下的异常:
Could not instantiate bean class [com.ricky.zero.pojo.DotaPlayer]: No default constructor found.
所有在重写构造方法的时候一定记得写一个无参的构造方法.
2.当然,我在DotaPlayer类中创建两个构造方法是有原因的,也许有人已经想到了,那现在就来看,Spring如何通过有参构造方法来注入Pojo对象.
3.已经写到的类和接口不用做任何改变,只需要将Spring的Configuration的作如下修改:
<bean id="dotaPlayer" class="com.ricky.zero.pojo.DotaPlayer"> <constructor-arg value="10"></constructor-arg> </bean>
<constructor-arg value="10"></constructor-arg>元素的作用是给构造器的传递参数,若没有该元素,Spring Container将会调用默认的构造器,若没有默认的构造器则会
抛上述异常.
4.修改完成后,运行结果若如下:
DOTA玩家已经杀了10个敌人.
则证明成功的使用有参数的构造方法注入Pojo对象.
5.在上述步骤里,成功的使用了有参和无参的构造器注入了Pojo对象,在有参构造器中,我给构造器的参数是基本类型的,下面将用构造器来注入一个Pojo对象.
首先我们创建一个Game接口,方便下面使用.
public interface Game { //获取游戏名称 public void getGameName(); }
创建一个魔兽争霸游戏类,类名War3继承自Game接口.
public class War3 implements Game { @Override public void getGameName() { // TODO Auto-generated method stub System.out.println("大家好,我的名字叫魔兽争霸,相信你们很多人都已经认识我了."); } }
6.在上述基础上修改两处,在DotaPlayer类中添加一个构造方法,如下:
//以对象类型为参数的构造方法 public DotaPlayer(War3 war3){ this.war3 = war3; };
在play()方法中,调用War3对象的getGameName()方法.如下:
//重写Player类中的play()方法 @Override public void play() { // TODO Auto-generated method stub System.out.println("DOTA玩家已经杀了"+ this.currentKill +"个敌人."); war3.getGameName(); }
在Spring的configuration中修改如下:
<bean id="war3" class="com.ricky.zero.pojo.War3"></bean> <bean id="dotaPlayer" class="com.ricky.zero.pojo.DotaPlayer"> <constructor-arg ref="war3"></constructor-arg> </bean>
第一个<bean id="war3" class="com.ricky.zero.pojo.War3"></bean>使用Spring中无参构造方法注入Pojo类,然后把已经实例化的对象作为dotaPlayer
bean的构造参数,注入到构造方法中.至此完成了用构造方法来注入对象.
7.让我们来检验用构造方法注入对象是否成功,若结果如下,则注入成功.
DOTA玩家已经杀了0个敌人.
大家好,我的名字叫魔兽争霸,相信你们很多人都已经认识我了.
------------------------------明天预告----------------------------
到此,用构造方法来注入有参或者无参的Pojo类就结束了,由于明天还要上班,今天就分享到这,明天我们讲分享Bean的Scope、
init-method 、destory-method以及如何使用setter方法来注入基本类型和Pojo类.
--------------------------------申明----------------------------
本文可以免费阅读以及转载,转载时请注明出处.
本人邮箱:Ricky_LS@163.com
Thank you for your corporation.