文章目录

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

前言

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


所以呢,我觉得还是由点必要去先学一下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。如图:

下面对这些模块进行详细介绍:

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

大哥们就直接去官网下载最新的就行:点我带你去官网呀
下载完成之后解压,当然我用的是3.2的稳定版本

我们再来看看每一个目录是啥意思:

名称 作用
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。



然后Finish,之后我们再添加需要的骨架。
右键项目名,添加骨架JavaWebSpring两个,我这儿是已经添加好了的。

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

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 {@Testpublic void test(){ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring-config.xml");PersonDao personDao= (PersonDao) applicationContext.getBean("personDao");personDao.add();}
}

5.运行该项目查看结果
我们去运行测试类之后,控制台输出的结果如下:

最后,编写不易,如果对你有帮助,点个赞吧!!!

Spring是什么?一文带你快速入门Spring相关推荐

  1. 一文带你快速入门【哈希表】

    最近开始学习哈希表,为此特写一遍文章介绍一下哈希表,带大家快速入门哈希表

  2. 网关是什么,一文带你快速入门腾讯技术工程

    今天来开门见山地讲讲网关是一个怎么样的组件,网关在做什么事情.网关这个词其实到处都在用,它可以工作在硬件层面,也可以工作在网络层,还可以工作在应用层. 网关快速入门 网关在做什么? 我们今天讲的实际上 ...

  3. Node是什么?一文带你快速入门Node

    一.Node是什么? 下面两篇文章是带你先简单了解Node,对于不了解小白推荐阅读一下 Node.js 究竟是什么? Node.js 是一个 JavaScript 运行时环境.听起来还不错,不过这究竟 ...

  4. 一文带你快速入门zabbix6.0的日常操作

    文章目录 前言 一. zabbix基本操作入门 1.1 登录和配置用户 1.1.1 登录zabbix 1.1.2 防爆力破解机制 1.1.3 创建用户 1.1.4 创建报警媒介 1.1.5 设置 权限 ...

  5. @valid 校验_一文带你快速入手 Spring Boot 参数校验

    点击上方"Java专栏",选择"置顶或者星标" 第一时间阅读精彩文章! ☞ 程序员进阶必备资源免费送「21种技术方向!」 点击查看☜ 作者:狂乱的贵公子 来源: ...

  6. 【效率】超详细!手把手带你快速入门 GitHub!

    作者:Peter     编辑:JackTian 来源:公众号「杰哥的IT之旅」 快速入门GitHub GitHub在程序开发领域家喻户晓,现在几乎整个互联网的开发者都将版本管理工具GitHub作为版 ...

  7. 手把手带你快速入门超越GAN的Normalizing Flow

    手把手带你快速入门超越GAN的Normalizing Flow 作者:Aryansh Omray,微软数据科学工程师,Medium技术博主 机器学习领域的一个基本问题就是如何学习复杂数据的表征是机器学 ...

  8. 带你快速入门AXI4总线--AXI4-Stream篇(1)----AXI4-Stream总线

    写在前面 随着对XILINX器件使用的深入,发现越来越多的IP都选配了AXI4的接口.这使得只要学会了AXI4总线的使用,基本上就能对XILINX IP的使用做到简单的上手.所以学会AXI4总线,对X ...

  9. 【编程不良人】快速入门Spring学习笔记08---事务属性、Spring整合Structs2框架(SM)、Spring整合Mybatis+Struts2(SSM)、Spring注解、SSM注解式开发

    1. 事务属性 1.1 事务传播属性 配套视频:[编程不良人]快速入门Spring,SpringBoot.SpringCloud学不好完全是因为Spring没有掌握!_哔哩哔哩_bilibili # ...

最新文章

  1. GaitSet:通过交叉视角步态识别
  2. 人人都可以做深度学习应用:入门篇
  3. 深度技术Win11 64位最新旗舰版镜像V2021.08
  4. 暴雪BN2.0 呼之欲出即将到来
  5. 如何打造顶级目标检测算法?百度官方揭秘 ECCV2020 双料冠军的理论与实践
  6. python获取小王的ip地址_用Python获取本机的IP地址
  7. 问题(二)--算法相关
  8. 基于Cocos2d-x开发guardCarrot--5 《保卫萝卜2》主页面音频
  9. 提现php防刷,PHP简单的防刷计数器–已经图片化
  10. 阿里云云计算 51 在线实验--安全中心初体验
  11. 爱奇艺连续三年独家直播中网赛事 打造高端体育赛事生态矩阵
  12. 面试了15位来自985/211高校的2020届研究生之后的思考
  13. 点阵图(位图)与矢量图的区别
  14. 如何往虚拟机里面复制文件(末尾附带视频教程)
  15. 【目标检测】YOLO系列——YOLOv1详解
  16. [故障集合] Linux的必遇到的故障及原因
  17. 基于机智云智能宠物屋的APP控制系统
  18. java+mysql 基于ssm的医院预约挂号系统(java ,web)
  19. Windows SSH服务安装
  20. windows 十大必备软件

热门文章

  1. LNK2019的常见情况及解决方法
  2. Android12 WebView无法播放视频的问题 浏览器暂不支持播放该格式
  3. 实现FCFS和SJF调度算法(电梯调度算法详解)
  4. 打印九九乘法口诀表——Java代码实现
  5. wifi dns服务器未响应,wifi设置dns服务器未响应
  6. Linux系统编程——多任务的同步与互斥
  7. mw150um 驱动程序win10_水星mw150um驱动
  8. java sleuth配置
  9. roc曲线的意义_【科研助手】ROC曲线在医学诊断类稿件中的应用
  10. 在JS数组指定位置插入元素