系统学习Spring之Spring in action(一)

废话两 句,以前也看过Spring in action,那时候只能草草的看看,没有仔细阅读,如今在读Spring in action 是想发奋图强,几个月后就要结婚了,也许会在今年会要宝宝,为了给宝宝一个更好的生活环境,为了做一个好爸爸,我从现在开始努力的工作,努力的学习,我想 在博客园中留下我的奋斗足迹,同时也鞭策自己,不要放弃自己的初衷。                                          

                                              --2013-03-18 刘帅 写于南京

----------------------------以上内容纯属战前动-------------------------  

    

  文章导读:

  1.〖用依赖注入实例到第一个Pojo类〗

  2.〖通过构造器来注入Pojo类〗

 

  Spring框架的核心是Spring Container,Spring有多种Spring Container的实现,但归根结底分为两类:

  1.BeanFactory创建最简单的Spring Container提供最基本的DI(Dependency Injection)和bean-wiring服务.

  2.ApplicationContext创建的SpringContainer提供更多的高级框架服务.

  在这篇文章中和以后的文章中,我会把主要的精力放在ApplicationContext创建的SpringContainer上,在以后的文章中不在赘述.

  Wiring Beans

   〖用依赖注入实例到第一个Pojo类〗

    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类.

 

  〖通过构造器来注入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类.

--------------------------------申明----------------------------       

                  本文可以免费阅读以及转载,转载时请注明出处.      

                  本人邮箱:[email protected]

                  Thank you for your corporation.

你可能感兴趣的:(spring)