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. 创建包,编写一个类文件

技术分享图片User.java

User.java

 

4. 书写Spring的配置文件,注册对象到Spring容器

对象和框架交流,通过配置文件交流。

Spring的配置文件存放位置任意,放在src目录下。名字也是任意,但是建议叫applicationContext.xml。

选中src,右键选择New --> XML Configuration File --> Spring Config,输入名字applicationContext,点击OK。

技术分享图片

技术分享图片

默认生成的文件约束是写了一些的。在我们这个例子中,上面默认生成的约束就够用了。

下面开始配置约束,这个user对象要交给Spring容器来管理。

技术分享图片applicationContext.xml

 

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.从容器中获得需要的对象
... 
posted @ 2019-05-15 08:16  zStao  阅读(373)  评论(0编辑  收藏  举报