spring环境的搭建比较简单,这里我也不做记录了。就是把在网上下载spring的包,然后解压复制到我们建立工程的lib目录下面,
然后在选中所有的jar包,在右边->build path->add to build path。
spring的核心就是控制反转(IOC),通过配置文件来对来完成业务对象之间的依赖注入,提倡注入用接口编程而不是类编程。
同时spring提供了一个强大而灵活的Web框架,它同样是基于控制反转的,这个框架由7个模块组成,如下图所示:
说了这么多Spring的有点,下面我们来开始第一个简单的Spring的Demo吧。
由于Spring鼓励我们使用接口编程,首先我们创建一个sayHello的interface,里面有一个抽象的sayHello方法。让我们的接下去类去实现这个接口。
这里提一下,Spring实现依赖注入有三种方法,分别是接口注入,set注入和构造注入。下面我们来介绍下set注入和构造注入,这两种也是比较常用的。
package cn.impl; public interface SayHello { public void sayHello(); }
下面我们建立一个He‘llWorld类来实现这个接口,这里我们先使用set注入来实现依赖注入。这里对每个变量都要写一个set方法,如果漏写后面注入时候会报错。
package cn.action; import java.util.Date; import cn.impl.SayHello; public class HelloWorld implements SayHello{ public String msg; public Date date; public String getMsg() { return msg; } //spring的set注入方法实现 public void setMsg(String msg) { this.msg = msg; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } @Override public void sayHello() { System.out.println("你好 "+msg+" "+date); } }
下面在来一个用英文说你好的EnHelloWorld类,同样也实现上面sayHello的接口。这里用构造注入的方法实现Spring的依赖注入,所以可以明显的看到这里是没有set方法的。但是这里有一个带参数的构造方法,里面写了我们需要注入的参数。
package cn.action; import java.util.Date; import cn.impl.SayHello; public class EnHelloWorld implements SayHello{ private String msg; private String address; private Date date; public EnHelloWorld(String msg,String address,Date date){ this.msg = msg; this.address = address; this.date = date; } @Override public void sayHello() { System.out.println("hello "+msg+","+address+" "+date); } }
这些都写完以后,我们在webRoot下的WEB-INF建立一个config.xml,这个是我们这里的配置文件,也是通过这个配置文件来实现对业务对象之间的依赖注入的。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.sprintframework.org/dtd/spring-beans.dtd"> <beans> <bean id="EnHelloWorld" class="cn.action.EnHelloWorld"> <constructor-arg index="0"> <value>xwt!</value> </constructor-arg> <constructor-arg index="1"> <value>cm!</value> </constructor-arg> <constructor-arg index="2"> <bean name="time" class="java.util.Date"/> </constructor-arg> </bean> <!--id中不可以包含特殊字符。一个bean中可以没有ID,此时可以用name来代替id, 可以有多个name,中间用‘,’隔开。id和name可以同时存在 --> <!--sigleton默认为true。当true时,会共享一个实例,每次请求返回的都是同一个。就是单例模式 如果为false,每次请求都会返回一个新创建的实例 --> <bean id="Ch" name="ChHelloWorld,dd;ff" class="cn.action.HelloWorld" singleton="true"> <property name="msg"> <value>xuweitao!</value> </property> <property name="date"> <ref bean="nowdate"/> </property> </bean> <bean id="date1" name="nowdate" class="java.util.Date" /> </beans>
这些都写完以后,我们现在建立一个测试类来测试我们的功能。
package cn.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; import cn.impl.SayHello; public class TestHelloWorld { public static void main(String[] args) { ApplicationContext ac = new FileSystemXmlApplicationContext("/WebRoot/WEB-INF/config.xml"); SayHello hw = (SayHello)ac.getBean("EnHelloWorld"); SayHello ch = (SayHello)ac.getBean("ff"); hw.sayHello(); ch.sayHello(); } }
然后运行这个测试类,可以得到如下的结果:
到这里我们就完成了我们的第一个小Demo。
这里有4点我们需要注意一下:
<bean id="Ch" name="ChHelloWorld,dd;ff,Ch,Ch" class="cn.action.HelloWorld" singleton="true">
上面写的完全是没问题的,当然一般情况下用id就可以了,id是整个config.xml中唯一的。
<bean id="Ch" name="ChHelloWorld,dd;ff,Ch,Ch" class="cn.action.HelloWorld" singleton="true"> <property name="msg"> <value>xuweitao!</value> </property> <property name="date"> <ref bean="nowdate"/> </property> </bean>
如果还有更多的参数,我们就继续在bean添加<property>就可以了。
<bean id="EnHelloWorld" class="cn.action.EnHelloWorld"> <constructor-arg index="0"> <value>xwt!</value> </constructor-arg> <constructor-arg index="1"> <value>cm!</value> </constructor-arg> <constructor-arg index="2"> <bean id="date" class="java.util.Date"/> </constructor-arg> </bean>
其中index代表的是我们在EnHelloWorld中的参数位置。0代表第一个。如果我们的构造方法只有1个参数,那么就不必要写index。
我们在bean中singleton这个选项默认的true。如果是true,则每次请求都会返回同一个实例,这样即使单例模式。如果为false,则每次请求都是新建一个实例对象返回。用法还得集体情况具体分析。比如说我们这个对象中有全局变量的时候,我们可以设置为true。
这一期就先写到这里!
原文:http://www.cnblogs.com/cmxwt/p/6274509.html