Spring入门
本章内容:
Spring是什么
Spring的好处
Spring包含的模块
名词解释
小结
搭建sping的运行环境
本章重点:
搭建sping的运行环境
Spring是什么?
Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
• 目的:解决企业应用开发的复杂性
• 功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
• 范围:任何Java应用
简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
Spring的好处
• 降低组件之间的耦合度,实现软件各层之间的解耦。
• 可以使用容器提供的众多服务,如:事务管理服务、消息服务等。当我们使用容器管理事务时,开发人员就不再需要手工控制事务,也不需处理复杂的事务传播。
• 容器提供单例模式支持,开发人员不再需要自己编写实现代码。
• 容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能。
• 容器提供众多辅助类,使用这些类能够加快应用的开发,如:JdbcTemplate、HibernateTemplate
• Spring对主流应用框架提供了集成支持,如:集成Hibernate、JPA、Struts等便于应用开发。
Spring包含的模块
Spring框架由七个定义明确的模块组成(图1.1)。
如果作为一个整体,这些模块为你提供了开发企业应用所需的一切。但你不必将应用完全基于Spring框架。你可以自由地挑选适合你的应用的模块而忽略其余的模块。
就像你所看到的,所有的Spring模块都是在核心容器之上构建的。容器定义了Bean是如何创建、配置和管理的——更多的Spring细节。当你配置你的应用时,你会潜在地使用这些类。但是作为一名开发者,你最可能对影响容器所提供的服务的其它模块感兴趣。这些模块将会为你提供用于构建应用服务的框架,例如AOP和持久性。
1、核心容器
这是Spring框架最基础的部分,它提供了依赖注入(Dependency Injection)特征来实现容器对Bean的管理。这里最基本的概念是BeanFactory,它是任何Spring应用的核心。BeanFactory是工厂模式的一个实现,它使用IoC将应用配置和依赖说明从实际的应用代码中分离出来。
2、应用上下文(Context)模块
核心模块的BeanFactory使Spring成为一个容器,而上下文模块使它成为一个框架。这个模块扩展了BeanFactory的概念,增加了对国际化(I18N)消息、事件传播以及验证的支持。 另外,这个模块提供了许多企业服务,例如电子邮件、JNDI访问、EJB集成、远程以及时序调度(scheduling)服务。也包括了对模版框架例如Velocity和FreeMarker集成的支持。
3、Spring的AOP模块
Spring在它的AOP模块中提供了对面向切面编程的丰富支持。这个模块是在Spring应用中实现切面编程的基础。为了确保Spring与其它AOP框架的互用性, Spring的AOP支持基于AOP联盟定义的API。AOP联盟是一个开源项目,它的目标是通过定义一组共同的接口和组件来促进AOP的使用以及不同的AOP实现之间的互用性。通过访问他们的站点http://aopalliance. sourceforge.net,你可以找到关于AOP联盟的更多内容。
Spring的AOP模块也将元数据编程引入了Spring。使用Spring的元数据支持,你可以为你的源代码增加注释,指示Spring在何处以及如何应用切面函数。
4、JDBC抽象和DAO模块
使用JDBC经常导致大量的重复代码,取得连接、创建语句、处理结果集,然后关闭连接。Spring的JDBC和DAO模块抽取了这些重复代码,因此你可以保持你的数据库访问代码干净简洁,并且可以防止因关闭数据库资源失败而引起的问题。
这个模块还在几种数据库服务器给出的错误消息之上建立了一个有意义的异常层。使你不用再试图破译神秘的私有的SQL错误消息!
另外,这个模块还使用了Spring的AOP模块为Spring应用中的对象提供了事务管理服务。
5、对象/关系映射集成模块
对那些更喜欢使用对象/关系映射工具而不是直接使用JDBC的人,Spring提供了ORM模块。Spring并不试图实现它自己的ORM解决方案,而是为几种流行的ORM框架提供了集成方案,包括Hibernate、JDO和iBATIS SQL映射。Spring的事务管理支持这些ORM框架中的每一个也包括JDBC。
6、Spring的Web模块
Web上下文模块建立于应用上下文模块之上,提供了一个适合于Web应用的上下文。另外,这个模块还提供了一些面向服务支持。例如:实现文件上传的multipart请求,它也提供了Spring和其它Web框架的集成,比如Struts、WebWork。
7、Spring的MVC框架
Spring为构建Web应用提供了一个功能全面的MVC框架。虽然Spring可以很容易地与其它MVC框架集成,例如Struts,但Spring的MVC框架使用IoC对控制逻辑和业务对象提供了完全的分离。
它也允许你声明性地将请求参数绑定到你的业务对象中,此外,Spring的MVC框架还可以利用Spring的任何其它服务,例如国际化信息与验证。
名词解释:
控制反转(IOC):是指应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓的反转
依赖注入(DI):在运行期,由外部容器动态地将依赖对象注入到组件中。
轻量级与重量级:划分一个应用属于轻量级还是重量级,主要看它使用了多少服务,使用服务越多,容器要为java对象做的工作就越多,必然会影响到应用的发布时间或运行性能。Spring容器提供了很多服务,但这些服务默认是关闭的,当应用需要某种服务的时候,还需要之名将使用该服务,spring默认只使用了spring的核心服务,所以是轻量级的,如果应用使用了spring的大部分服务,则为重量级的。
注意:DI与IOC相对来说 是一样的概念。
小结
Spring带来了复杂的J2EE开发的春天。它的核心是轻量级的IoC容器,它的目标是为J2EE应用提供了全方位的整合框架,在Spring框架下实现多个子框架的组合,这些子框架之间可以彼此独立,也可以使用其它的框架方案加以代替,Spring希望为企业应用提供一站式(one-stop shop)的解决方案。
搭建sping的运行环境
一、 建立一个新的项目
a) 建立新的项目;
b) 建立需要的bean类(Person)
Person类:
public class Person {
private String name;
//省略getter和setter方法
}
二、 建立spring的配置文件(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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<!-- 注入bean对象,id为标识名称,class为bean的路径-->
<bean id="Person" class="com.hope.entity.Person">
<!-- 注入属性 -->
<property name="name">
<!-- 注入属性值 -->
<value>张三</value>
</property>
</bean>
</beans>
三、 引入spring的jar包
可以建立一个lib
搭建spring环境基本的包:
commons-logging-1.0.4.jar
spring-beans.jar
spring-context.jar
spring-core.jar
测试代码:
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
BeanFactory bf = new ClassPathXmlApplicationContext("applicationContext.xml");
Person person =(Person)bf.getBean("Person");
System.out.println(person.getName());
}
}
注意:这里使用的ClassPathXmlApplicationContext和BeanFactory是spring的
四、 注意接口的使用:
ClassPathXmlApplicationContext类实现了ApplicationContext接口,而ApplicationContext接口又实现了BeanFactory接口,这样BeanFactory是根上的接口。一般建议使用ApplicationContext接口,因为:
- BeanFactory:只是完成Bean工厂的基本功能,不能完成bean的生命周期
- ApplicationContext:除了完成bean工厂的基本功能外,还完成的其它的附加功能(比如:bean的生命周期),也就是功能更强大
这样上面的代码就是
public void testAdd_3() throws Exception {
ApplicationContext factory = new ClassPathXmlApplicationContext("applicationContext.xml");
Person person =(Person)app.getBean("Person");
System.out.println(person.getName());
}
五、基本类型和字符串类型属性的装配(value)
<property name="name">
<value>张三</value>
</property>
六、引用类型属性的装配
<property>
<ref bean="otherBean" />
</property>
(1)ref: local 只在当前配置文件中找
(2)ref:bean 在所有的配置文件中
(3)直接把另外一个bean的定义,定义在一个bean里面。
相当于定义了个内部类,但是客户端就不可见内部定义的bean
七、集合类型属性的装配
- list:可以混合存放各种类型,支持泛型,存放的数据是有序的,可以有重复,
- set:可以混合存放各种类型,支持泛型,存放的数据是无序的,不可以重复
- map:支持泛型,存放键值对。
- props:本质上也是一个map,但是键值都是字符串类型的。
例子:
<!-- list集合-->
<property name="listProperty">
<list>
<value>zhengwei</value>
<value>zhengwei</value>
<value>zhengwei</value>
</list>
</property>
<!-- Set集合-->
<property name="setProperty">
<set>
<value>str</value>
<value>str</value>
<value>str1</value>
</set>
</property>
<!-- map集合-->
<property name="mapProperty">
<map>
<entry key="key1">
<value>value1</value>
</entry>
<entry key="key2">
<value>value2</value>
</entry>
</map>
</property>
<!-- props -->
<property name="proProperty">
<props>
<prop key="key1">value1</prop>
<prop key="key2">value2</prop>
<prop key="key3">value3</prop>
</props>
</property>