Spring学习总结(一):Spring简介和简单案例

一、Spring框架的介绍

1、Spring简介

       Spring 是分层的 Java SE/EE 应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control: 反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核,提供了展现层 Spring MVC 和持久层 Spring JDBC 以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的 Java EE 企业应用开源框架。

       在实际开发中,我们通常将服务器端分为三层架构:表现层(web)、业务逻辑层(service)、持久层(dao)。Spring对每一层都提供了技术支持,在表现层提供了与Struts2、Spring MVC框架的整合,在业务逻辑层可以管理事务和日志信息记录等,在持久层可以整合Mybatis、Hibernate等技术。

       Spring框架从设计上给予了Java程序员更高的自由度,对业界常见的问题提供了良好的解决方案。因此,在开源社区极受欢迎,并逐步成为Java项目开发的首选框架。

       Spring既是一种非侵入式的框架,也是一种一站式框架。那么何为非侵入式框架?何为一站式框架呢?

       首先,来介绍一下非侵入式和侵入式。

       当开发程序的时候,我们如果使用到框架。在使用该框架时,要继承框架提供的实体类或实现框架提供的接口,这就说明该框架是侵入式框架,因为程序本身对框架有了依赖,当去除框架时,程序也就无法运行,这个也就是我们说的重量级框架,如struts1中,action和actionForm必须要继承Action和ActionForm一样。反之,非侵入式框架是轻量级框架的重要特点,如hibernate和spring,当我们想去掉hibernate和Spring框架时,只需修改相应的程序,程序仍可运行。简单来说,非侵入式就是不继承框架提供的类,而是通过配置完成依赖注入后,就可以使用

       Spring中非侵入式的技术体现:允许在应用系统中自由选择和组装Spring框架的各个功能模块,并且不强制要求应用系统的类必须从Spring框架的系统API的某个类来继承或者实现某个接口。

       如何实现非侵入式的设计目标的?

        应用反射机制,通过动态调用的方式来提供各方面的功能,建立核心组间BeanFactory。

       配合使用Spring框架中的BeanWrapper和BeanFactory组件类最终达到对象的实例创建和属性注入。

       优点:允许所开发出来的应用系统能够在不用的环境中自由移植,不需要修改应用系统中的核心功能实现的代码。

       再来简单说一下何为一站式框架?

       这其实是一种溢美之词,形容Spring框架很全面、整合度高,简单来说就是包罗万象,很多技术都可以和Spring进行整合。

2、Spring的体系结构

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

       下面对这些模块做一些简单介绍:

(1) Data Access/Integration(数据访问/集成)

       数据访问/集成层包括 JDBC、ORM、OXM、JMS 和 Transactions 模块,具体介绍如下。

      1)JDBC 模块:提供了一个 JDBC 的抽象层,大幅度减少了在开发过程中对数据库操作的编码。

      2) ORM 模块:对流行的对象关系映射 API,包括 JPA、JDO、Hibernate和 iBatis 提供了的集成层。

      3) OXM 模块:提供了一个支持对象/XML 映射的抽象层实现,如 JAXB、Castor、XMLBeans、JiBX 和 XStream。

      4) JMS 模块:指 Java 消息服务,包含的功能为生产和消费的信息。

      5)Transactions 事务模块:支持编程和声明式事务管理实现特殊接口类,并为所有的 POJO。

 (2) Web 模块

       Spring 的 Web 层包括 Web、Servlet、Struts 和 Portlet 组件,具体介绍如下。

      1) Web 模块:提供了基本的 Web 开发集成特性,例如多文件上传功能、使用的 Servlet 监听器的 IoC 容器初始化以及 Web 应用上下文。

      2)  Servlet模块:包括 Spring 模型—视图—控制器(MVC)实现 Web 应用程序。

      3) Struts 模块:包含支持类内的 Spring 应用程序,集成了经典的 Struts Web 层。

      4) Portlet 模块:提供了在 Portlet 环境中使用 MV C实现,类似 Web-Servlet 模块的功能。

(3)Core Container(核心容器)

       Spring 的核心容器是其他模块建立的基础,由 Beans 模块、Core 核心模块、Context 上下文模块和 Expression Language 表达式语言模块组成,具体介绍如下。

       1)Beans 模块:提供了 BeanFactory,是工厂模式的经典实现,Spring 将管理对象称为 Bean。

       2) Core 核心模块:提供了 Spring 框架的基本组成部分,包括 IoC 和 DI 功能。

       3) Context 上下文模块:建立在核心和 Beans 模块的基础之上,它是访问定义和配置任何对象的媒介。ApplicationContext 接口是上下文模块的焦点。

       4) Expression Language 模块:是运行时查询和操作对象图的强大的表达式语言。

(4)Test模块

       Test 模块:支持 Spring 组件,使用 JUnit 或 TestNG 框架的测试,提供对应用的单元测试、集成测试的支持。

(5)其他模块

       Spring的其他模块还有 AOP、Aspects、Instrumentation ,具体介绍如下。

       1) AOP 模块:提供了面向切面编程实现,允许定义方法拦截器和切入点,将代码按照功能进行分离,以降低耦合性。

       2) Aspects 模块:提供与 AspectJ 的集成,是一个功能强大且成熟的面向切面编程(AOP)框架。

       3) Instrumentation 模块:提供了类工具的支持和类加载器的实现,可以在特定的应用服务器中使用。

       4) Messaging模块:提供对消息传递体系的支持。

3、Spring的组成

       Spring有七个模块,每个模块都是独立存在,模块与模块可以相互组合使用,如下图:

(1)Spring核心容器(Spring Core)

       核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转(IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。

(2)Spring 上下文(Spring Context)

       Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。

(3)Spring AOP

       通过配置管理特性,Spring AOP 模块直接将面向切面的编程功能 , 集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理任何支持 AOP的对象。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖组件,就可以将声明性事务管理集成到应用程序中。

(4)Spring DAO

       JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。

(5)Spring ORM

       Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。

(6)Spring Web 模块

       Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。

(7)Spring MVC 框架

       Spring MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。

 4、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)声明式事务的支持。只需要通过配置就可以完成对事务的管理,而无须手动编程

二、Spring的简单入门案例

       在通常情况下,我们创建一个对象的方式都是通过new来完成的,如:User user  = new User()。那么,在接下来的案例中,如何通过Spring去完成对象的创建,并调用其中的方法呢?

1、案例步骤

(1)创建maven工程。

(2)引入Spring5相关jar包,包括:spring-core、spring-beans、junit、spring-context、spring-expression、commons-logging。

(3)创建User类,并定义showMessage()方法。

(4)在resources下创建bean.xml,在xml中配置bean对象。

(5)进行单元测试。

       1)加载配置文件bean.xml

       2)获取bean对象。

       3)调用showMessage()方法。

2、实现过程

       首先,创建一个maven工程,并在pom.xml中引入Spring的相关jar包,如下:

<dependencies>
  <!--    单元测试-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>5.2.6.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.2.6.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>5.2.6.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-expression</artifactId>
      <version>5.2.6.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.2</version>
    </dependency>
  </dependencies>

       关于这几个jar包的作用可参考此博客:https://www.cnblogs.com/fmling/p/5979840.html

       创建User类,如下:

public class User {

    public void showMessage(String name, Integer age){
        System.out.println("name is : " + name + ", age is : " + age);
    }
}

       在resources目录下创建bean.xml,配置User类,如下:

<?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">
    <!-- 配置User
        <bean> 配置需要创建的对象
            id :用于之后从spring容器获得实例时使用的,可以随便取名,如:aa、abc
            class :需要创建实例的全限定类名
    -->
    <bean id="user" class="com.yht.example1.entity.User"></bean>
</beans>

       通过Spring创建User对象,并调用其中的方法:

public class UserTest {
    @Test
    public void testUser(){
        //加载Spring配置文件
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
        //通过配置文件中bean的id获取bean对象
        User user = (User) applicationContext.getBean("user");//参数与bean.xml中配置的id值一致
        //调用showMessage()方法
        user.showMessage("tom", 23);
    }
}

       执行结果如下:

        刚刚我们提到在bean.xml中bean的id是可以随便取名的,那么真的可以吗?接下来我们就测试一下。

       将bean的id改为abc,然后进行测试。

<bean id="abc" class="com.yht.example1.entity.User"></bean>
User user = (User) applicationContext.getBean("abc");

       执行所得结果仍为:name is : tom, age is : 23。

3、要点

       在Spring中,实体类对象必须有一个默认的无参构造,否则bean.xml就会报错。

       这里可以简单测试一下,在User类中给一个私有属性name,并提供有参构造。此时在bean.xml中就会报错。

猜你喜欢

转载自blog.csdn.net/weixin_47382783/article/details/112705962