Spring是什么?一文带你快速入门Spring

文章目录

      • 前言
      • Spring是啥?它有啥好处
      • Spring体系结构详解
      • Spring目录结构和基础JAR包介绍
      • Spring IOC容器:BeanFactory和ApplicationContext
          • BeanFactory
          • ApplicationContext
      • 第一个Spring程序

前言

从今天开始,怀着无比急切(操蛋)的心情开始学习Spring。我看了网上很多的大佬说,SpringBoot上手舒服一些,说SpringBoot简化了配置啥的。但是我呢,有一点自己的小见解,我连Spring是个啥我都不知道我还直接上手SpringBoot,wc,我啥时候能耐那么大了。

Spring是什么?一文带你快速入门Spring_第1张图片
所以呢,我觉得还是由点必要去先学一下Spring的吧。。。所以我会每天更新一下自己的学习见解,也会把自己遇到的坑贴给大家,共同学习共同进步。

话还是不多bb了,我们先看一下Spring是个啥吧。

Spring是啥?它有啥好处

懂英文的大哥呢,建议直接一键Spring官网,小弟这儿也给出了地址。

当然,不是很懂英文的话还是慢慢听小弟bb两句。

Spring是另一个主流的JavaWeb开发框架,当然,要接触Spring的话,你肯定得先去接触一下JavaWeb。该框架是一个轻量级的应用框架,具有很高的凝聚力和吸引力。Spring框架因为其强大的功能和牛逼的性能越来越受开发人员的喜欢。那就跟光棍五十年遇到女人一样的饥渴啊。

Spring是分层的 Java SE/EE full-stack 轻量级开源框架,以IOC(Inverse of Control,控制反转)AOP(Aspect Oriented Programming,面向切面编程)为内核,使用基本的JavaBean完成以前只可能由EJB完成的工作,取代了EJB臃肿和低效的开发模式。

在实际开发中,通常服务器端采用分层架构——表现层(web)业务逻辑层(service)持久层(dao)

Spring对每一层都提供了技术支持,在表现层提供了与Struts2框架的整合,在业务逻辑层可以管理事务和记录日志,在持久层可以整合HibernateJdbcTemplate等技术。

从设计上看,Spring框架给予了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)声明事务的支持
只需要通过配置就可以完成对事务的管理,而不用我们去手动编程。

Spring体系结构详解

Spring框架采用分层架构,根据不同的功能被划分成了多个模块,这些模块大体可分为Data Access/IntergrationWebAOPAspectsMessagingInstrumentationCore ContainerTest。如图:
Spring是什么?一文带你快速入门Spring_第2张图片
下面对这些模块进行详细介绍:

1)Data Access/Integration(数据访问/集成)
数据访问/集成层包括JDBC、ORM、OXM、JMS和Transactions模块,具体介绍如下:

  • JDBC模块:提供了一个JDBC的抽象层,大幅度减少了在开发过程中对数据库操作的编码。
  • ORM模块:对流行的对象关系映射API,包括JPA,JDO、Hibernate和iBatis提供了的集成层
  • 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。
  • Core 核心模块:提供了 Spring 框架的基本组成部分,包括 IoC 和 DI 功能。
  • Context 上下文模块:建立在核心和 Beans 模块的基础之上,它是访问定义和配置任何对象的媒介。ApplicationContext 接口是上下文模块的焦点。
  • Expression Language 模块:是运行时查询和操作对象图的强大的表达式语言。

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

  • AOP 模块:提供了面向切面编程实现,允许定义方法拦截器和切入点,将代码按照功能进行分离,以降低耦合性。
  • Aspects 模块:提供与 AspectJ 的集成,是一个功能强大且成熟的面向切面编程(AOP)框架。
  • Instrumentation 模块:提供了类工具的支持和类加载器的实现,可以在特定的应用服务器中使用。
  • Test 模块:支持 Spring 组件,使用 JUnit 或 TestNG 框架的测试。

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

这玩意儿也不需要我们去配置啥环境变量什么的。
按照官网的介绍,目前最新的版本应该是5.2.5
Spring是什么?一文带你快速入门Spring_第3张图片
大哥们就直接去官网下载最新的就行:点我带你去官网呀
下载完成之后解压,当然我用的是3.2的稳定版本
Spring是什么?一文带你快速入门Spring_第4张图片
我们再来看看每一个目录是啥意思:

名称 作用
docs 包含Spring的API文档和开发规范
libs 包含开发需要的JAR包和源码包
schema 包含开发所需要的 schema 文件,在这些文件中定义了 Spring 相关配置文件的约束

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

名称 作用
spring-core-3.2.13.RELEASE.jar 包含 Spring 框架基本的核心工具类,Spring 其他组件都要用到这个包中的类,是其他组件的基本核心。
spring-beans-3.2.13.RELEASE.jar 所有应用都要用到的,它包含访问配置文件、创建和管理 bean 以及进行 Inversion of Control(IoC)或者 Dependency Injection(DI)操作相关的所有类。
spring-context-3.2.13.RELEASE.jar Spring 提供在基础 IoC 功能上的扩展服务,此外还提供许多企业级服务的支持,如邮件服务、任务调度、JNDI 定位、EJB 集成、远程访问、缓存以及各种视图层框架的封装等
spring-expression-3.2.13.RELEASE.jar 定义了 Spring 的表达式语言。需要注意的是,在使用 Spring 开发时,除了 Spring 自带的 JAR 包以外,还需要一个第三方 JAR 包 commons.logging 处理日志信息

大家可以去网址下载。

在使用的时候只需要将Spring的四个基础包以及commons-logging-1.2.jar包复制到项目的lib目录下然后添加到类路径中就行。

Spring IOC容器:BeanFactory和ApplicationContext

在前面已经介绍Spring框架时已经提到过Ioc思想,我们再看看具体是啥样的。

Ioc指的是在程序开发中,实例的创建不再由调用者去管理,而是由Spring容器创建。Spring容器会负责控制程序之间的关系,而不是由程序代码去控制,因此,控制权由程序代码转移到了Spring容器中,控制权发生了反转 ,这个就是Spring中的Ioc思想。

Spring提供了两种Ioc容器,分别是BeanFactory和ApplicationContext,接下来对这两种进行详细讲解。

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"));

不过,我们实际开发的时候很少会用这个,一般都是下面这个。

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。

第一个Spring程序

讲了这么久,我们还是来看看具体的Spring程序怎么来写吧。

在idea中创建一个maven项目,名为SpringDemo01。
Spring是什么?一文带你快速入门Spring_第5张图片
Spring是什么?一文带你快速入门Spring_第6张图片
Spring是什么?一文带你快速入门Spring_第7张图片
然后Finish,之后我们再添加需要的骨架。
右键项目名,添加骨架JavaWebSpring两个,我这儿是已经添加好了的。
Spring是什么?一文带你快速入门Spring_第8张图片

然后坐等生成文件夹就完事儿了。

1.创建PersonDao接口
在java目录下创建名为com.zxy.ioc的包,在该包中创建一个PersonDao接口,并在这个接口中写一个add()方法;

package com.zxy.ioc;

public interface PersonDao {
    void add();
}

2.创建接口实现类PersonDaoImpl
在com.zxy.ioc包下创建PersonDao的实现类PersonDaoImpl。

package com.zxy.ioc;

public class PersonDaoImpl implements PersonDao{
    public void add() {
        System.out.println("容器被添加了");
    }
}

3.创建Spring配置文件
如果你在添加Spring骨架的时候勾选了create…啥的选项,那么会为你自动创建一个spring-config.xml文件,这个就是spring的配置文件。如果没勾选也不要紧,自己创建一个也行,目录放在resources目录下;

<?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.zxy.ioc.PersonDaoImpl"/>
</beans>

这儿创建了一个id为personDao的bean实例,其中id是该文件的唯一标识符,class属性就是你要实例化的类(包名+类名)
4.编写测试类
在com.zxy.ioc包下创建测试类FirstTest,并且在类中使用junit测试。

package com.zxy.ioc;

import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class FirstTest {
    @Test
    public void test(){
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring-config.xml");
        PersonDao personDao= (PersonDao) applicationContext.getBean("personDao");
        personDao.add();
    }
}

5.运行该项目查看结果
我们去运行测试类之后,控制台输出的结果如下:
Spring是什么?一文带你快速入门Spring_第9张图片

最后,编写不易,如果对你有帮助,点个赞吧!!!Spring是什么?一文带你快速入门Spring_第10张图片

你可能感兴趣的:(Spring,spring,java,第一个Spring程序,spring学习,JavaEE)