Spring框架

1.Java Spring框架是什么?它有哪些好处?

           Spring 是分层的 Java SE/EE full-stack【JavaSE/JavaEE一站式】 ,以 IoC(Inverse of Control,控制反转)和 AOP
    (Aspect Oriented Programming,面向切面编程)为内核轻量级的开源的框架。
           在实际开发中,通常服务器端采用三层体系架构,分别为表现层(web)、业务逻辑层(service)、持久层(dao)。
           Spring 对每一层都提供了技术支持,在表现层提供了与 Struts2 框架的整合,在业务逻辑层可以管理事务和记录日志等,在
    持久层可以整合 Hibernate 和 JdbcTemplate ,MyBatis等技术。
           从设计上看,Spring 框架给予了 Java 程序员更高的自由度,对业界的常见问题也提供了良好的解决方案,因此,在开源社区
    受到了广泛的欢迎,并且被大部分公司作为 Java 项目开发的首选框架。
           Spring 具有简单、可测试和松耦合等特点,不仅可以用于服务器端的开发,也可以应用于任何 Java 应用的开发中。
           Spring 框架的主要优点具体如下。
           1)方便解耦,简化开发
                Spring 就是一个大工厂,可以将所有对象的创建和依赖关系的维护交给 Spring 管理。
           2)方便集成各种优秀框架
                Spring 不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如 Struts2、Hibernate、MyBatis 等)的直接支持。
           3)降低 Java EE API 的使用难度
                Spring 对 Java EE 开发中非常难用的一些 API(JDBC、JavaMail、远程调用等)都提供了封装,使这些 API 应用的难
                度大大降低。
           4)方便程序的测试
                Spring 支持 JUnit4,可以通过注解方便地测试 Spring 程序。
           5)AOP 编程的支持
                Spring 提供面向切面编程,可以方便地实现对程序进行权限拦截和运行监控等功能。
           6)声明式事务的支持
                只需要通过配置就可以完成对事务的管理,而无须手动编程。

2.Spring体系结构详解

           Spring框架采用分层架构,根据不同的功能被划分成了多个模块,这些模块大体可分为 Data Access/Integration、Web、
    AOP、Aspects、Messaging、Instrumentation、Core Container 和 Test,如下图所示。

           图 1 中包含了 Spring 框架的所有模块,这些模块可以满足一切企业级应用开发的需求,在开发过程中可以
    根据需求有选择性地使用所需要的模块。下面分别对这些模块的作用进行简单介绍。

  1. Data Access/Integration(数据访问/集成)
           数据访问/集成层包括 JDBC、ORM、OXM、JMS 和 Transactions 模块,具体介绍如下。
           JDBC 模块:提供了一个 JDBC 的抽象层,大幅度减少了在开发过程中对数据库操作的编码。
           ORM 模块:对流行的对象关系映射 API,包括 JPA、JDO、Hibernate 和 MyBatis 提供了的集成层。
           OXM 模块:提供了一个支持对象/XML 映射的抽象层实现,如 JAXB、Castor、XMLBeans、JiBX 和 XStream。
           JMS 模块:指 Java 消息服务,包含的功能为生产和消费的信息。
           Transactions 事务模块:支持编程和声明式事务管理实现特殊接口类,并为所有的 POJO。
  2. Web 模块
           Spring 的 Web 层包括 Web、Servlet、Struts 和 Portlet 组件,具体介绍如下。
           Web 模块:提供了基本的 Web 开发集成特性,例如多文件上传功能、使用的 Servlet 监听器的 IoC 容器初始化以及
                              Web 应用上下文。
           Servlet模块:包括 Spring 模型—视图—控制器(MVC)实现 Web 应用程序。
           Struts 模块:包含支持类内的 Spring 应用程序,集成了经典的 Struts Web 层。
           Portlet 模块:提供了在 Portlet 环境中使用 MV C实现,类似 Web-Servlet 模块的功能。
  3. Core Container(核心容器)
           Spring 的核心容器是其他模块建立的基础,由 Beans 模块、Core 核心模块、Context 上下文模块和 Expression Language
    表达式语言模块组成,具体介绍如下。
           Beans 模块:提供了 BeanFactory,是工厂模式的经典实现,Spring 将管理对象称为 Bean。[Spring将被管理的元素都称
                                 之为Bean【组件】]
           Core 核心模块:提供了 Spring 框架的基本组成部分,包括 IoC【控制反转】 和 DI【依赖注入】 功能。
           Context 上下文模块:建立在核心和 Beans 模块的基础之上,它是访问定义和配置任何对象的媒介。ApplicationContext 接
                                              口是上下文模块的焦点。
           Expression Language 模块:是运行时查询和操作对象图的强大的表达式语言。
  4. 其他模块
           Spring的其他模块还有 AOP、Aspects、Instrumentation 以及 Test 模块,具体介绍如下。
           AOP 模块:提供了面向切面编程实现,允许定义方法拦截器和切入点,将代码按照功能进行分离,以降低耦合性。
           Aspects 模块:提供与 AspectJ 的集成,是一个功能强大且成熟的面向切面编程(AOP)框架。
           Instrumentation 模块:提供了类工具的支持和类加载器的实现,可以在特定的应用服务器中使用。
           Test 模块:支持 Spring 组件,使用 JUnit 或 TestNG 框架的测试。

3.Spring目录结构和基础JAR包介绍

           目前 Spring 框架的最新版本是 5.3.5,本教程是基于 Spring 的稳定版本5.1.5进行讲解的可以通过网址 https://repo.spring.io/
    simple/libs-release-local/org/springframework/spring/
 下载名称为 springframework-5.1.5.RELEASE-dist.zip 的压缩包。在浏览器
    的地址栏中输入此下载地址后,浏览器的访问结果如图 1 所示。

                                                                                                                                                 图 1  访问结果

           从图 1 中找到所需要的 Spring 框架压缩包。单击此链接下载,下载完成后,解压文件的目录结构如图 2 所示。

                                                                                                                                                 图 2  解压后目录

           下面对图2所示的目录进行简单介绍,具体如表 1 所示。

表 1 Spring 的目录介绍

名称

作用

docs

包含 Spring 的 API 文档和开发规范

libs

包含开发需要的 JAR 包和源码包

schema

包含开发所需要的 schema 文件,在这些文件中定义了 Spring 相关配置文件的约束

           在 libs 目录中,包含了 Spring 框架提供的所有 JAR 文件,其中有四个 JAR 文件是 Spring 框架的基础包,分别对
    应 Spring 容器的四个模块,具体如表 2 所示。

表 2 Spring 依赖 JAR 包介绍

名称

作用

spring-core-5.1.5.RELEASE.jar

包含 Spring 框架基本的核心工具类,Spring 其他组件都要用到这个包中的类,是其他组件的基本核心。

spring-beans-5.1.5.RELEASE.jar

所有应用都要用到的,它包含访问配置文件、创建和管理 bean 以及进行 Inversion of Control(IoC)或者 Dependency Injection(DI)操作相关的所有类。

spring-context-5.1.5.RELEASE.jar

Spring 提供在基础 IoC 功能上的扩展服务,此外还提供许多企业级服务的支持,如邮件服务、任务调度、JNDI 定位、EJB 集成、远程访问、缓存以及各种视图层框架的封装等

spring-expression-5.1.5.RELEASE.jar

定义了 Spring 的表达式语言。
需要注意的是,在使用 Spring 开发时,除了 Spring 自带的 JAR 包以外,还需要一个第三方 JAR 包 commons.logging 处理日志信息

           我们可以通过网址 https://commons.apache.org/proper/commons-logging/download_logging.cgi下载。该
    JAR 包现在最新版本为 commons-logging.1.2,下载完成后,解压即可找到。
           使用 Spring 框架时,只需将 Spring 的四个基础包以及 commons-logging-1.2.jar 包复制到项目的 lib 目录,
    并发布到类路径中即可。

4.Spring IoC容器:BeanFactory和ApplicationContext

           前面介绍 Spring 框架时,已经提到过 Spring 的 IoC(控制反转)思想,本节来详细介绍一下 Spring 的 Ioc 容器。
           IoC 是指在程序开发中,实例的创建不再由调用者管理,而是由 Spring 容器创建。Spring 容器会负责控制程序之
    间的关系,而不是由程序代码直接控制,因此,控制权由程序代码转移到了 Spring 容器中,控制权发生了反转,这就
    是 Spring 的 IoC 思想。
           Spring 提供了两种 IoC 容器,分别为 BeanFactory 和 ApplicationContext,接下来将针对这两种 IoC 容器进行详细讲解。
  1.BeanFactory
           BeanFactory 是基础类型的 IoC 容器,它由 org.springframework.beans.facytory.BeanFactory 接口定义,并提供了完整
    的 IoC 服务支持。简单来说,BeanFactory 就是一个管理 Bean 的工厂,它主要负责初始化各种 Bean,并调用它们的生命周
    期方法。
           BeanFactory 接口有多个实现类,最常见的是 org.springframework.beans.factory.xml.XmlBeanFactory,它是根据 XML
    配置文件中的定义装配 Bean 的。
           创建 BeanFactory 实例时,需要提供 Spring 所管理容器的详细配置信息,这些信息通常采用 XML 文件形式管理。其加载
    配置信息的代码具体如下所示:

BeanFactory beanFactory =
new XmlBeanFactory(new FileSystemResource("D://applicationContext.xml"));

  2.ApplicationContext
           ApplicationContext 是 BeanFactory 的子接口,也被称为应用上下文。该接口的全路径为 org.springframework.
    context.ApplicationContext,它不仅提供了 BeanFactory 的所有功能,还添加了对 i18n(国际化)、资源访问、事
    件传播等方面的良好支持。

  ApplicationContext 接口有两个常用的实现类,具体如下。
    1)ClassPathXmlApplicationContext
           该类从类路径 ClassPath 中寻找指定的 XML 配置文件,找到并装载完成 ApplicationContext 的实例化工作,
    具体如下所示。

ApplicationContext applicationContext =
new ClassPathXmlApplicationContext(String configLocation);

           在上述代码中,configLocation 参数用于指定 Spring 配置文件的名称和位置,如 applicationContext.xml。
  2)FileSystemXmlApplicationContext
           该类从指定的文件系统路径中寻找指定的 XML 配置文件,找到并装载完成 ApplicationContext 的实例化工作,具体
    如下所示。

ApplicationContext applicationContext =
new FileSystemXmlApplicationContext(String configLocation);

           它与 ClassPathXmlApplicationContext 的区别是:在读取 Spring 的配置文件时,FileSystemXmlApplicationContext 不再从
    类路径中读取配置文件,而是通过参数指定配置文件的位置,它可以获取类路径之外的资源,如“F:/workspaces/
    applicationContext.xml”。
           在使用 Spring 框架时,可以通过实例化其中任何一个类创建 Spring 的ApplicationContext 容器。
           通常在 Java 项目中,会采用通过 ClassPathXmlApplicationContext 类实例化 ApplicationContext 容器的方式,而在
    Web 项目中,ApplicationContext 容器的实例化工作会交由 Web 服务器完成。Web 服务器实例化 ApplicationContext 容
    器通常使用基于ContextLoaderListener
    实现的方式,它只需要在 web.xml 中添加如下代码:

<!--指定Spring配置文件的位置,有多个配置文件时,以逗号分隔-->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <!--spring将加载spring目录下的applicationContext.xml文件-->
    <param-value>
        classpath:spring/applicationContext.xml
    </param-value>
</context-param>
<!--指定以ContextLoaderListener方式启动Spring容器-->
<listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>

           需要注意的是,BeanFactory 和 ApplicationContext 都是通过 XML 配置文件加载 Bean 的。
           二者的主要区别在于,如果 Bean 的某一个属性没有注入,则使用 BeanFacotry 加载后,在第一次调用 getBean() 方法
    时会抛出异常,而 ApplicationContext 则在初始化时自检,这样有利于检查所依赖的属性是否注入。
           因此,在实际开发中,通常都选择使用 ApplicationContext,而只有在系统资源较少时,才考虑使用 BeanFactory。本
    教程中使用的就是 ApplicationContext。

5.第一个Spring程序

           通过上一节内容的学习,读者对 Spring 的 IoC 容器已经有了一个初步的了解。下面通过具体的案例演示 IoC 容器的使用。

  1.创建项目

           默认创建的项目没有resource目录,我们需要自己补resource目录。

           删除默认创建的App.java
           pom.xml导入Spring依赖包

<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>5.1.5.RELEASE</version>
</dependency>

  2. 创建 PersonDao 接口
           在项目的 src/main/java目录下创建一个名为 com.wangxing.springtest.dao的包,然后在该包中创建一个名为 PersonDao
    的接口,并在接口中添加一个 add() 方法,如下所示。

package com.wangxing.springtest.dao;

public interface PersonDao {
    public void add();
}

  3. 创建接口实现类 PersonDaoImpl
           在 com.wangxing.springtest.dao.impl 包下创建 PersonDao 的实现类 PersonDaoImpl,编辑后如下所示。

package com.wangxing.springtest.dao.impl;
import com.wangxing.springtest.dao.PersonDao;
public class PersonDaoImpl implements PersonDao {
    @Override
    public void add() {
        System.out.println("执行add()添加方法.........");
    }
}

           上述代码中,PersonDaoImpl 类实现了 PersonDao 接口中的 add() 方法,并且在方法调用时会执行输出语句。
  4. 创建 Spring 配置文件
           在 src/main/resources 目录下创建 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.xsd">
    <!-- 由 Spring容器创建该类的实例对象 -->
    <bean id="personDao" class="com.wangxing.springtest.dao.impl.PersonDaoImpl"></bean>
</beans>

           上述代码中,第 2~5 行代码是 Spring 的约束配置,第 7 行代码表示在 Spring 容器中创建一个 id 为 personDao
    的 bean 实例,其中 id 表示文件中的唯一标识符,class 属性表示指定需要实例化 Bean 的实全限定类名(包名+类名)。
           需要注意的是,Spring 的配置文件名称是可以自定义的,通常情况下,都会将配置文件命名为 applicationContext.xml
    (或 bean.xml)。
  5. 编写测试类
           在src/test/java中创建com.wangxing.springtest包,在包里面创建测试类

package com.wangxing.sprinttest;

import com.wangxing.springtest.dao.PersonDao;
import javafx.application.Application;
import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.core.io.FileSystemResource;

public class TestClass {
    /**
     * 测试1
     */
    @Test
    public void tesst1(){
        //通过XmlBeanFactory创建BeanFactory的Spring容器对象
        BeanFactory beanFactory=new XmlBeanFactory(new FileSystemResource("F:/wangxingkejian/IdeaProject/SpringDemo1/SpringDemo1/src/main/resources/applicationContext.xml"));
        //从Spring容器中取得创建好的java对象
        PersonDao persondao =(PersonDao)beanFactory.getBean("personDao");
        persondao.add();
    }

    /**
     * 测试2
     */
    @Test
    public void tesst2(){
        //通过ClassPathXmlApplicationContext创建ApplicationContext的Spring容器对象
        //从类路径classpath中寻找指定的xml配置文件
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        //从Spring容器中取得创建好的java对象
        PersonDao persondao =applicationContext.getBean("personDao",PersonDao.class);
        persondao.add();
    }

    /**
     * 测试3
     */
    @Test
    public void tesst3(){
        //通过FileSystemXmlApplicationContext创建ApplicationContext的Spring容器对象
        //从文件路径中寻找指定的xml配置文件
        ApplicationContext applicationContext=new FileSystemXmlApplicationContext("F:/wangxingkejian/IdeaProject/SpringDemo1/SpringDemo1/src/main/resources/applicationContext.xml");
        //从Spring容器中取得创建好的java对象
        PersonDao persondao =applicationContext.getBean("personDao",PersonDao.class);
        persondao.add();
    }
}

  6. 运行项目并查看结果

                                                                                                                                                图 2  输出结果

           从图 2 的输出结果中可以看出,程序已经成功输出了“执行add()添加方法......”语句。在程序执行时,对象的创建并不是通过
    new 一个类完成的,而是由 Spring 容器管理实现的。这就是 Spring IoC 容器思想的工作机制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值