1.Spring概述
Spring是一个开源框架,它能够降低开发企业应用程序的复杂性,可以使用Spring替代EJB开发企业级应用,而不用担心工作量太大、开发进度难以控制和复杂的测试过程等问题。Spring简化了企业级应用的开发,降低了开发成本,能够整合各种流行框架。它以IoC(控制反转)和AOP(面向切面编程)两种先进的技术为基础,完美的简化了企业级开发的复杂度。
1.1初识Spring
Spring框架主要由七大模块组成,他提供了企业级开发需要的所有功能,而且每个模块都可以单独使用,也可以和其他莫款组合使用,灵活且方便的部署可以使开发的程序更加简洁。
- 核心模块:Spring Core模块是Spring的核心容器,他实现了IoC模式,提供了Spring框架的基础功能,在模块中包含最重要的BeanFactory类是Spring的核心类,负责对JavaBean的配置和管理。他采用了Factory模式实现了IoC容器,即依赖注入
2.Context模块:Spring Context模块继承BeanFactory(或者说是Spring核心)类,并且添加了事件处理、国际化、资源装载、透明装载以及数据校验等功能。他还提供了框架式的Bean的访问方式和很多企业级的功能,如JNDI访问、支持EJB、远程调用、集成模板框架、E-mail和定时任务调度等。
3.AOP模块:Spring集成了所有的AOP功能。通过事务管理可以使任意Spring管理的对象AOP化。Spring提供了用标准Java语言编写的AOP框架,他的大部分内容都是根据AOP联盟的API开发的,他使应用程序抛开EJB的复杂性,但拥有传统EJB的关键功能。
4.DAO模块:提供JDBC的抽象层,简化了数据库厂商的异常错误,大幅度减少代码的编写,并且提供了对声明式事务和编程式事务的支持。
5.ORM模块:提供对现有ORM框架的支持,各种流行的ORM框架已经做的非常成熟了,所以没有必要开发新的ORM工具,但是他对Hibernate提供了完美的整合功能,同时也支持其他的ORM工具。
6.WEB模块:建立在Spring Context基础之上,他还提供了Servlet监听器的Context和Web应用的上下文,对现有的Web框架提供集成。
7.MVC模块:建立在Spring的核心功能之上,这使得他能拥有Spring框架的所有特性,能够适应多种视图,模块技术、国际化和验证服务,实现控制逻辑和业务逻辑清晰的分离。
2.准备
在开始进行开发之前,我们首先需要获得Spring工具包、commons-logging包。并且我们可以简单的查看一下他们的官方文档。之后,我们就能正常的开展下一步了。
3.第一个Spring实例
笔者在介绍的过程中,先给出一个完整的spring简单实例,可以大体上的了解一些Spring的开发过程,然后,我们再进行介绍里面的原理。
步骤:
- 首先,我们在eclipse中建立一个JavaProject,并创建SpringDemo工程
- 其次,在SpringDemo工程的src目录下创建com.bean包,在该包下分别创建Person.java、ChineseImpl.java和AmercianImpl.java 3个文件,编辑代码如下:
代码清单1:person.java
package com.bean;
public interface Person {
public void speak();
}
代码清单2:ChineseImpl.java
package com.bean;
public class ChineseImpl implements Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public void speak() {
// TODO Auto-generated method stub
System.out.println("我是中国人,我的名字是" + this.name + ", 我今年" + this.age + "岁!");
}
}
代码清单3:AmercianImpl.java
package com.bean;
public class AmercianImpl implements Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public void speak() {
// TODO Auto-generated method stub
System.out.println("我是美国人,我的名字是" + this.name + ",我今年" + this.age + "岁!");
}
}
上面的代码中,我们定义了一个person接口,通过该接口规定了Person的规范,并且进行了两个实例,在我们进行代码的编写的过程中,我们可以使用接口与实现的分离,这样可以大大的增大代码的重用性以及复用性。
那么,问题来了?在Spring中显然应该让Spring容器来负责调用这两个类的Setter方法以设置实例中属性的值。这在Spring中是如何实现的呢?根据我们在学习Struts2以及Hibernate中的知识我们可以想到应该使用XML配置文件来实现。下面我们在Spring中使用配置文件applicationContext.xml来告知容器应该如何对AmericanImpl和ChineseImpl进行配置
- 在src目录下创建applicationContext.xml文件。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<!-- 配置chinese实例,其实现类com.bean.ChineseImpl -->
<bean id="chinese" class="com.bean.ChineseImpl">
<!-- 将值“小明”注入给name属性 -->
<property name="name">
<value>小明</value>
</property>
<!-- 将值10注入给age属性 -->
<property name="age">
<value>10</value>
</property>
</bean>
<bean id="amercian" class="com.bean.AmercianImpl">
<!-- 将值"Tom”注入给name属性 -->
<property name="name">
<value>Tom</value>
</property>
<!-- 将值15注入给age属性 -->
<property name="age">
<value>15</value>
</property>
</bean>
</beans>
上面的XML文件在Spring容器中声明了一个ChineseImpl实例chinese和一个AmercianImpl实例amercian并为其中的set方法进行赋值。
- Test类
在src目录下创建com.spring包,在该包下创建Test.java文件。
package com.spring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.bean.Person;
public class Test {
public static void main(String[] args) {
/*创建spring容器*/
//当然这里还有beanFactory接口,也能实现这种功能,ApplicationContext增加了更多的企业级应用
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
/*获取ChineseImpl实例的引用*/
Person person = (Person) context.getBean("chinese");
//调用ChineseImpl实例的speak()方法
person.speak();
person = (Person) context.getBean("amercian");
person.speak();
}
}
程序中。我们需要注意的是spring容器的创建,这样就能将applicationContext.xml文件加载进容器中,并且进行实例化,以及调用set方法进行赋值,这样就能为其中实现一个最基本的Spring操作应用了。
**
ChineseImpl和AmericanImpl类的实例并不是main()方法来创建的,而是通过将applicationContext.xml文件加载后,交付给Spring框架,当执行getBean()方法时,就可以得到要创建实例的引用,因此,调用者并没有创建实例,而是通过Spring框架将创建好的实例注入调用者中,这实际上就是Spring的核心控制:依赖注入(DI),而Spring强大的地方就在于他可以使用依赖注入将一个Bean注入到另一个Bean中。
**
4. Spring的IoC容器
Spring的IoC容器是一个提供IoC支持的轻量级容器,IoC容器为管理对象之间的依赖关系提供了基础功能。Spring为我们提供两种容器:BeanFactory和ApplicationContext。
BeanFactory在Spring中的作用至关重要,他实际上是一个用于配置和管理Java类的内部接口。顾名思义,BeanFactory就是一个管理Bean的工厂,它负责初始化各种Bean并调用他们的生命周期方法。
当然,在进行XML文件的配置的时候,我们也可以选择使用annotation(注解)来进行编写里面的配置关系,而且感觉上比使用XML文件来的更加的直接方便。
5.Spring框架的优势
- Spring框架能够有效的组织中间层对象,Spring框架能够有效的将现有的框架如Struts和Hibernate框架组织起来。
- Spring框架实现了真正意义上的面向接口编程,可实现组件之间的高度解耦,而面向接口编程是一种良好的编程习惯。
- Spring所秉承的设计思想就是让使用Spring创建的那些应用都尽可能少地依赖于它的APIs。在Spring应用中的大多数业务对象都不依赖于Spring。
- 使用Spring构建的应用程序易于进行单元测试
- Spring提高了代码的可重用性,它尽可能避免在程序中使用硬解码。Spring可以将应用程序中的某些代码抽象出来,然后在其他程序中使用这些代码。
- Spring为数据存取提供了一个一致的框架,简化了底层数据库的访问方式。