spring环境的搭建比较简单,这里我也不做记录了。就是把在网上下载spring的包,然后解压复制到我们建立工程的lib目录下面,
然后在选中所有的jar包,在右边->build path->add to build path。
spring的核心就是控制反转(IOC),通过配置文件来对来完成业务对象之间的依赖注入,提倡注入用接口编程而不是类编程。
同时spring提供了一个强大而灵活的Web框架,它同样是基于控制反转的,这个框架由7个模块组成,如下图所示:
- Spring Core:提供了Spring框架的核心功能,BeanFactory是Spring核心容器的主要组件。他通过控制反转将应用程序的配置和依赖性规范与实际的应用程序代码分开,是整个Spring的基础。
- Spring Context:通过读取配置文件,向Spring框架提供上下文信息。它构建在BeanFacory之上,另外增加了国际化、资源访问等功能。
- Spring AOP:Spring提供了面向切面编程的功能,因为Spring核心是基于控制反转的,所以可以很容易的使Spring的依赖注入为AOP提供支持。
- Spring DAO:提供了简单有效的JDBC应用,足够应付日常的开发。
- Spring ORM:Spring除了自己有JDBC之外,还提供了对其他一些ORM框架的支持,如:Hibernate,Mybatis等。这些开源框架都可以和Spring进行良好的结合。
- Spring Web:提供了简化的处理多部分请求以及将请求参数绑定到域对象的任务。
- Spring MVC:Spring提供了MVC2模式的实现,使用起来非常方便。Spring可以和Struts集成在一起。
说了这么多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点我们需要注意一下:
- 我们在写config.xml的时候,每个<bean>都需要唯一的一个标识。当然这个标识可以用<bean id="”>来表示,也可以用<bean id="name">来表示,甚至这两个可以同时存在。它们的区别就是id只能有一个,且不能存在特殊字符,而name可以有很多个。name可以和前面的id相同,多个name之间用','或者';'隔开。如果有多个name,后面的都是这个id的别名。同一个id中的name可以有重复的name,但是不能和别的id中的name相同。
<bean id="Ch" name="ChHelloWorld,dd;ff,Ch,Ch" class="cn.action.HelloWorld" singleton="true">
上面写的完全是没问题的,当然一般情况下用id就可以了,id是整个config.xml中唯一的。
- 我们在set注入的时候,如果一个bean中有多个参数,我们可以参照一下的写法:
<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。
这一期就先写到这里!