快速上手Spring--2.HelloWorld(2)

这是第二部分。
3. 采用“工厂模式”
 
· 新建一个包,包名:javamxj.spring.beginning2,在这个包下,新建一个“Hello”接口,这个接口含有一个方法。 

Hello.java

package javamxj . spring . beginning2 ;

public interface Hello {
    void sayHello();
}
 
· 分别新建两个类,实现这个接口。
HelloWorld.java
package javamxj . spring . beginning2 ;

public class HelloWorld implements Hello {

    public void sayHello() {
        System.out.println( "Hello World!");
    }
}
 

HelloJavamxj.java

package javamxj . spring . beginning2 ;

public class HelloJavamxj implements Hello {

    public void sayHello() {
        System.out.println( "Hello, javamxj!");
    }
}
 
· 建立一个工厂类,调用上面两个实现接口的子类。 

HelloFactory.java

package javamxj . spring . beginning2 ;

public class HelloFactory {

    public Hello getHello( String hello) {

        if (hello.equals( "world"))
            return new HelloWorld();
        else if (hello.equals( "javamxj"))
            return new HelloJavamxj();
        else
            throw new IllegalArgumentException( "输入参数错误!");
    }
}
 
· 最后,利用工厂类,测试一下。

Test.java

package javamxj . spring . beginning2 ;

public class Test {
    public static void main( String[] args) {

        Hello hello = null;
        HelloFactory factory = new HelloFactory();

        hello = factory.getHello( "world");
        hello.sayHello();

        hello = factory.getHello( "javamxj");
        hello.sayHello();
    }
运行Test,控制台输出如下语句:
Hello World!
Hello, javamxj!
 
 
 
4. Setter Injection
 
讲了这么多,似乎一点都不关Spring的事,别急,下面就看看用Spring是如何实现的。
 
· 新建一个包,包名:javamxj.spring.beginning3
· 在这个包下,新建一个HelloBean的类,这个类有一个属性:helloWorld属性,这个属性只是一个字符串。可以通过setHelloWorld方法设置这个属性,getHelloWorld方法得到这个属性。

HelloBean.java

package javamxj . spring . beginning3 ;

public class HelloBean {

    private String helloWorld = "Hello!World!";

    public void setHelloWorld( String helloWorld) {
        this.helloWorld = helloWorld;
    }

    public String getHelloWorld() {
        return helloWorld;
    }

}
 
· 同样,在这个包下,建立一个XML文件,它是Spring配置文件。

bean.xml

<? xml version="1.0" encoding= "GBK" ?>
<! DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd" >

< beans >
    < bean id= " helloBean " class= " javamxj.spring.beginning3.HelloBean " >
        < property name= " helloWorld " >
            < value >Hello! Javamxj! </ value >
        </ property >
    </ bean >
</ beans >
 
  Spring配置文件必须遵循spring-beans.dtd定义的内容模型。
 
  这个XML文件在Spring容器中声明了一个HelloBean的实例,并且将它的helloWorld属性设置为“Hello! Javamxj!”。
  分析这个XML文件,位于根部的是<beans>元素,它是任何Spring配置文件的根元素。<bean>元素用于告诉Spring容器一个类以及它是如何配置的。这里,id属性用于为Bean helloBean命名,而class属性指定了这个Bean的全限定类名。
  在<bean>元素内,<property>元素用于设置一个属性,在本例中它是helloWorld属性。通过使用<property>,我们告诉Spring容器当设置这个属性时调用setHelloWorld方法。greeting属性的值定义在<value>元素内。在这里我设置为“Hello! Javamxj!”。
 
  bean.xml必须在您的CLASSPATH可以存取到的目录中。
 
 
 
· 新建Main.java,测试一下。

Main.java

package javamxj . spring . beginning3 ;

import org . springframework . beans . factory . BeanFactory ;
import org . springframework . beans . factory . xml . XmlBeanFactory ;
import org . springframework . core . io . ClassPathResource ;
import org . springframework . core . io . Resource ;

public class Main {
    public static void main( String[] args) {

        // 直接调用HelloBean
        HelloBean helloBean = new HelloBean();
        System.out.println(helloBean.getHelloWorld());

        // 利用Spring调用HelloBean
        Resource res = new ClassPathResource( "javamxj/spring/beginning3/bean.xml");
        BeanFactory factory = new XmlBeanFactory(res);

        helloBean = (HelloBean) factory.getBean( "helloBean");
        System.out.println(helloBean.getHelloWorld());
    }
}
 
  这里使用的BeanFactory类就是Spring容器。在将hello.xml文件装入容器后,main方法调用BeanFactory的getBean方法检索出了helloBean服务的一个引用。通过这个引用,它调用了getHelloWorld方法。当我们运行这个Hello应用时,它会打印出“Hello! Javamxj!”。
 
 
· 另外,为了更好的调试程序,了解运行机理,建立一个log4j.properties,放在src目录下。 

src/log4j.properties

log4j.rootLogger=warn, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%c{1} - %m%n 
 
 
 
 
5. Constructor Injection
 
· 新建一个包,包名:javamxj.spring.beginning3
· 新建一个HelloBean.java文件,可以与Setter Injection中的HelloBean比较一下,注意是通过Constructor设置helloWorld属性值的。

HelloBean.java

package javamxj . spring . beginning4 ;

public class HelloBean {

    private String helloWorld;

    public HelloBean( String helloWorld) {
        this.helloWorld = helloWorld;
    }

    public void sayHello() {
        System.out.println(helloWorld);
    }
}
 
· 同样,在这个包下,也需要一个Spring配置文件。

bean.xml

<? xml version="1.0" encoding= "GBK" ?>
<! DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd" >

< beans >
    < bean id= " helloBean " class= " javamxj.spring.beginning4.HelloBean " >
        < constructor-arg >
            < value >Hello! Javamxj! </ value >
        </ constructor-arg >
    </ bean >
</ beans >
   这里通过<constructor-arg>来表示将使用 constructor injection。如果constructor的参数不只一个,那么需要利用index属性指定参数的位置索引,即<constructor-arg index="索引值">,索引值从0开始。 
 
· 测试一下。 

Main.java

package javamxj . spring . beginning4 ;

import org . springframework . beans . factory . BeanFactory ;
import org . springframework . beans . factory . xml . XmlBeanFactory ;
import org . springframework . core . io . ClassPathResource ;
import org . springframework . core . io . Resource ;

public class Main {
    public static void main( String[] args) {

        Resource res = new ClassPathResource( "javamxj/spring/beginning4/bean.xml");
        BeanFactory factory = new XmlBeanFactory(res);

        HelloBean helloBean = (HelloBean) factory.getBean( "helloBean");
        helloBean.sayHello();
    }
}
 
 
 
   这样,通过BeanFactory的getBean方法,以及xml配置文件,避免了在Main类中直接实例化HelloBean,消除了应用程序(Main)与服务(HelloBean)之间的耦合,实现了IOC(控制反转)或者说实现了依赖的注射(Dependency Injection)。
  
   Setter Injection和Constructor Injection都有自己的长处和不足。至于,是选择Setter Injection,还是选择Constructor Injection?在《Spring in Action》、《 Inversion of Control Containers and the Dependency Injection pattern》和《 Spring开发指南》都有比较详细的论述,这里就不多说了。
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值