Spring in Action这本书可以说是非常好的一本讲解Spring框架的好书,现在出版了第三版,包含了Spring3.0的许多
新特性,特此拿来好好系统的学习一番,以前对Spring有所了解,但是不是非常的详细,现在打算好好的认真的研究一
下Spring,先从最基础的开始吧。
这里声明了一个非常简单的Bean然后使用Spring的依赖注入技术实现对他的调用。
package com.bird.springidol; /** * declaring a simple bean * @author Bird * */ public class Juggler { private int beanBags = 3; public Juggler(){ } public Juggler(int beanBags){ this.beanBags=beanBags; } public void perform(){ System.out.println("Juggling "+beanBags+" BEANBAGS"); } }
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" > <bean id="duke" class="com.bird.springidol.Juggler"></bean>
然后使用Junti测试框架进行测试
/** * declaring a simple bean */ @Test public void test1(){ ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); Juggler ju = (Juggler) ctx.getBean("duke"); ju.perform(); }
通过构造函数传入参数的注入方式
还是刚才的那个代码,这里使用了不同的配置方式
<bean id="duke1" class="com.bird.springidol.Juggler"> <constructor-arg value="15"></constructor-arg> </bean>
/** * Injecting through constructors */ @Test public void test2(){ ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); Juggler ju = (Juggler) ctx.getBean("duke1"); ju.perform(); }
通过构造函数传入对象
package com.bird.springidol; /** * injecting object references with constructors * @author Administrator * */ public class Poeticjuggler extends Juggler { private Poem poem;//倚赖注入的 public Poeticjuggler(Poem poem){ super(); this.poem=poem; } public Poeticjuggler(int beanBags, Poem poem){ super(beanBags); this.poem=poem; } public void perform(){ super.perform(); System.out.println("whing reciting....."); poem.recite(); } }
package com.bird.springidol; public class Sonnect29 implements Poem { @Override public void recite() { System.out.println("this is a poem that too long"); } }
<bean id="sonnet29" class="com.bird.springidol.Sonnect29"></bean> <bean id="poeticDuke" class="com.bird.springidol.Poeticjuggler"> <constructor-arg value="15"></constructor-arg> <constructor-arg ref="sonnet29"></constructor-arg> </bean>
很多类使用单例设计模式,这样的对象只能通过静态方法生成一个对象,这里说一下如何注入这些对象
package com.bird.springidol; /** * creating beans through factory methods * @author Administrator * */ public class Staage { private Staage(){} private static class StageSingletonHolder{ static Staage instance = new Staage(); } public static Staage getInstance(){ return StageSingletonHolder.instance; } }
<bean id="theStage" class="com.bird.springidol.Staage" factory-method="getInstance"></bean>
在创建和删除Bean的时候调用的代码
只需要这样配置
<bean id="test1" class="" init-method="" destroy-method=""></bean>
注入对象的属性
package com.bird.springidol; /** * injecting into bean properties * * @author Administrator * */ public class Instrumentalist { private String song; private Instrument instrument; public String getSong() { return song; } public void setSong(String song) { this.song = song; } public Instrument getInstrument() { return instrument; } public void setInstrument(Instrument instrument) { this.instrument = instrument; } public Instrumentalist(){} public void perform(){ System.out.println("playing"+song+":"); instrument.play(); } }
package com.bird.springidol; public class Saxophone implements Instrument { public Saxophone(){} @Override public void play() { System.out.println("TOOT TOOT TOOT"); } }
<bean id="saxophone" class="com.bird.springidol.Saxophone"></bean> <bean id="kenny" class="com.bird.springidol.Instrumentalist"> <property name="song" value="Jingle Bells"></property> <property name="instrument" ref="saxophone"></property> </bean>