Chinaunix首页 | 论坛 | 博客
  • 博客访问: 823561
  • 博文数量: 165
  • 博客积分: 3900
  • 博客等级: 中校
  • 技术积分: 1886
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-06 15:15
文章分类

全部博文(165)

文章存档

2020年(3)

2019年(8)

2017年(2)

2016年(8)

2015年(14)

2013年(15)

2012年(32)

2011年(11)

2010年(14)

2009年(7)

2008年(20)

2007年(31)

分类: Java

2008-01-15 02:47:29

采用“工厂模式”
 
·  新建一个包,包名: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
 

"http://www.springframework.org/dtd/spring-beans.dtd">


       
               
                       Hello!  Javamxj!
               

       

 

 
   Spring配置文件必须遵循spring-beans.dtd定义的内容模型。
 
   这个XML文件在Spring容器中声明了一个HelloBean的实例,并且将它的helloWorld属性设置为“Hello!  Javamxj!”。
   分析这个XML文件,位于根部的是元素,它是任何Spring配置文件的根元素。元素用于告诉 Spring容器一个类以及它是如何配置的。这里,id属性用于为Bean  helloBean命名,而class属性指定了这个Bean的全限定类名。  
   在元素内,元素用于设置一个属性,在本例中它是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
 

"http://www.springframework.org/dtd/spring-beans.dtd">


       
               
                       Hello!  Javamxj!
               

       

 

     这里通过来表示将使用  constructor  injection。如果constructor的参数不只一个,那么需要利用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开发指南》都有比较详细的论述,这里就不多说了。
阅读(902) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~