spring
一、Spring介绍
1. 什么是Spring
Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由 RodJohnson 在其著作 Expert One-On-One J2EE Development and Design 中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring 使用基本的 JavaBean 来完成以前只可能由 EJB 完成的事情。然而,Spring 的用途不仅限于服务器端的开发,去开发android也可以。从简单性、可测试性和松耦合的角度而言,任何 Java 应用都可以从 Spring 中受益。Spring 的核心是控制反转 (IoC)和面向切面(AOP)。简单来说,Spring 是一个分层的 JavaSE/EEfull-stack(一站式) 轻量级 开源框架。
JavaEE开发分成三层结构:
- WEB层
- 业务层
- 持久层
三层架构中Spring的位置:
Spring是一个大的容器,其中装了很多对象,之前三层架构在运行时,都需要自己来创建对象,比如在web层中需要使用service层中的,需要new。当使用了Spring之后,Spring中已经存好了项目中需要的对象。也就是在三层中,需要对象时不需要在写new了,而是跟Spring要这个对象。
Spring是一站式框架:纯Spring开发一个项目是完全没问题的。正是因为Spring框架性质是属于容器性质的(比如Spring之所以能处理请求,是因为容器中装了能处理请求的框架,所以它在web层能处理请求),容器中装什么对象,就有什么功能。所以可以一站式。
- WEB层:Spring MVC
- 业务层:Bean管理:(IoC)
- 持久层:Spring的JDBC模板。ORM模板用于整合其他的持久层框架。
2. 为什么要学习Spring
- 方便解耦,简化开发
- Spring 就是一个大工厂,可以将所有对象创建和依赖关系维护,交给 Spring 管理
- AOP 编程的支持
- Spring 提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
- 声明式事务的支持
- 只需要通过配置就可以完成对事务的管理,而无需手动编程
- 方便程序的测试
- Spring 对 Junit4 支持,可以通过注解方便的测试 Spring 程序
- 方便集成各种优秀框架
- Spring 不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz 等)的直接支持 降低 JavaEE API 的使用难度
- Spring 对 JavaEE 开发中非常难用的一些 API(JDBC、JavaMail、远程调用等),都提供了封装,使这些 API 应用难度大大降低。
3. Spring 的版本
Spring 3.X 和 Spring4.X
Spring 3.0.2版本:将市面上常见的、支持整合进来的工具类全部进行了收录,这个包里面有很多很多jar包。但是这是Spring坚持“做好事”的最后一个版本,没有任何回报。
以Spring 4.2.4为例:解压压缩包spring-framework-4.2.4.RELEASE-dist.zip
- docs是Spring的文档,API和开发规范
- lib下是Spring的jar包和源码包
- schema下是Spring当中的约束文件
lib目录下的包看起来很多,其实是3个一组:
二、Spring搭建示例
1. 下载导包
Spring官网:http://spring.io/
下载地址: http://repo.springsource.org/libs-release-local/org/springframework/spring
解压好的lib下的jar包不会都用,针对需要选择相应的jar包。
2. 创建web项目,引入Spring的开发包
在 web/WEB_INF/ 目录下创建一个lib目录,把下图中的4个jar包放进lib目录下。
Spring本身也是支持日志的,市面上已经有非常成熟的日志包了,Spring日志系统使用的是Apache开发出来的日志包。所以还需要导入Apache的日志方面的jar包,这部分jar包不在Spring解压后的lib下,得去Apache官方网站下载。把com.springsource.org.apache.commons.logging-1.1.1.jar和com.springsource.org.apache.log4j-1.2.15.jar复制到lib目录下。新版本的Spring应该不需要导入com.springsource.org.apache.log4j-1.2.15.jar,导了也不会错。
点击 File --> Project Structure,进入 Project Structure窗口,点击 Modules --> 选中项目 --> 切换到 Dependencies 选项卡 --> 点击下面的“+”,选择 “JARs or directories...”,选择创建的lib目录。
3. 创建包,编写一个类文件
![技术分享图片](http://www.mamicode.com/img/jia.gif)
User.java
4. 书写Spring的配置文件,注册对象到Spring容器
对象和框架交流,通过配置文件交流。
Spring的配置文件存放位置任意,放在src目录下。名字也是任意,但是建议叫applicationContext.xml。
选中src,右键选择New --> XML Configuration File --> Spring Config,输入名字applicationContext,点击OK。
默认生成的文件约束是写了一些的。在我们这个例子中,上面默认生成的约束就够用了。
下面开始配置约束,这个user对象要交给Spring容器来管理。
![技术分享图片](http://www.mamicode.com/img/jia.gif)
5. 代码测试
在 src 下创建一个包:com.wisedu.test,然后创建一个类文件testSpringDemo.java:
package com.wisedu.test; import org.junit.Test; import org.springframework.context.ApplicationContext; //这是一个接口,创建容器对象时需要找其实现类 import org.springframework.context.support.ClassPathXmlApplicationContext; import com.wisedu.springDemo.User; /** * Created by jkzhao on 12/7/17. */ public class testSpringDemo { @Test public void test1(){ //1.创建容器对象(创建Spring的工厂类) ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); //ClassPathXmlApplicationContext(从类路径下加载xml的Application容器)是org.springframework.context.ApplicationContext的实现类 //2.向容器"要"User对象(通过工厂解析XML获取Bean实例) User user = (User)ac.getBean("user"); //3.打印User对象 System.out.print(user); } }
运行该方法,然后可以发现打印出值了,也就是获取到了User对象。
【注意】:上面在test1方法中,创建容器是使用 ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); 来创建的,每个项目中只有一个applicationContext对象,不是每个方法中都要创建一下。如何保证只创建一个?
之前学过一个ServletContext域对象,它在一个项目中只有一份,随着程序的启动而创建,随着程序的停止而销毁。这就用到了Listener。监听器中有8个监听器,使用其中一个监听器:ServletContext域创建和销毁的Listener。这样当ServletContext创建时我们可以创建applicationContext对象,当ServletContext销毁时,我们可以销毁applicationContext对象。这样applicationContext就和ServletContext“共生死了”。使用这个监听器还有一个好处,在监听器中可以非常方便地获得事件源,也就意味着我们可以获得ServletContext对象,这个容器被放进了ServletContext域对象中,说通俗点,就是被放进了application域中。Spring已经把这个监听器写好了,我们只需要在web.xml中配置下就可以了。当然还需要导入一个包:spring-web-4.2.4.RELEASE.jar
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
前面在讲到Spring容器时说道,Spring的配置文件位置任意,Spring配置文件名字任意,所以这意味着还需要在web.xml中指明该配置文件的位置及名称。
<!-- 可以让spring容器随着项目的启动而创建,随项目的关闭而销毁--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!--指定加载Spring配置文件的位置--> <context-param> <param-name>contextConfigLocation</param-name> <!--这个key不能改,背下来--> <param-value> classpath*:/applicationContext.xml </param-value> </context-param>
接着写java代码从application域中获取容器。但是application域中存放东西是键值对存在的,我们得知道键才能取。Spring考虑到这种情况,准备了一个工具方法,把键封装在工具方法中了。
//1.这里以Struts2为例获取ServletContext对象 ServletContext sc = ServletActionContext.getServletContext(); //2.从sc中获得ac容器 WebApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(sc); //3.从容器中获得需要的对象 ...