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

博客介绍了采用工厂模式创建接口、实现类和工厂类并进行测试。还讲述了用Spring实现Setter Injection和Constructor Injection,包括创建类、配置XML文件、测试等步骤,通过这些实现了IOC和依赖注射,同时指出两种注入方式各有优劣。
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开发指南》都有比较详细的论述,这里就不多说了。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值