spring boot web项目_阿里技术专家带你使用Spring框架快速搭建Web工程项目

点击上方 "程序员小乐"关注, 星标或置顶一起成长

第一时间与你相约

每日英文

We all have a past. It’s how you deal with it.

每个人都有过去,只是取决于你怎么去处理。

每日掏心话

人不都是这样吗,安慰别人的时候头头是道,自己遇上点过不去的坎立马无法自拔,道理都懂,只是情绪作祟,故事太撩人。

来自:萌萌怪兽 | 责编:乐乐

链接:yq.aliyun.com/articles/592945

86bb52f44246bb10dd1a0efe4071fdd0.png

程序员小乐(ID:study_tech)第 705 次推文 图片来自网络

往日回顾:千万别惹程序员,否则会在代码注释里,告诉这家公司有多坑!、ef+Npoi导出百万行excel之踩坑记

正文

Spring 框架是一个开源的 Java 平台,它为容易而快速的开发出耐用的 Java 应用程序提供了全面的基础设施。借助于Spring框架可以快速搭建Web工程项目,本文中阿里巴巴高级开发工程师嵛山就带大家一起入门Spring框架。

视频回顾地址:click.aliyun.com/m/49796/


演讲嘉宾简介:

吕德庆(花名:嵛山), 阿里巴巴高级开发工程师,武汉大学地信硕士,有丰富的系统开发经验,目前就职于阿里巴巴代码中心团队,负责后端开发。
本文首先将介绍Spring框架的相关概念,其次将借助Spring Web示例工程带大家学习如何快速开发Spring Web应用。


一、Spring介绍

Spring是一个开源的Java企业应用开发框架,其诞生的目标就是简化Java应用开发。下图中是早期Spring版本的模块图,可以看到Spring框架的基座是Spring Core模块,其支撑了Spring的上层模块AOP、DAO、ORM等,而Spring Core的核心就是IOC容器。其实整个Spring框架的核心主要有两个:IOC和AOP。

085f261e8d4a9836e0e8ea73ea1fc911.png

IOC

IOC,即Inversion of Control,也就是控制反转。控制反转的概念从字面上比较晦涩难懂,而且每个Spring开发工程师对于这个概念也都有不同的理解。想要理解控制反转,首先要弄清楚控制指的是什么的控制,反转又指的反转什么。

b3bd3052e02c9029aa15da773557b9aa.png

首先看正常程序的伪代码,在这段代码中有一个Process进程类,实例化之后还有一个Thread线程类,由于进程必须有一个主线程才能正常运行,所以进程是依赖于线程的,那么就需要在进程中设置主线程。代码中将实例化的线程对象设置进去,这样进程才完整并且能够运行起来。
这里的控制就是通过编码的形式控制了对象的实例化,通过编码主动设置对象的依赖并最终得到一个可以运行的对象。假如在正常的套路里面剧情出现了反转,但是反转的结果还是能够得到一个正常运行的进程,那么能够反转的部分就是实例化的部分以及依赖设置的部分。将实例化以及依赖关系的设置的控制权反转就需要IOC容器接收控制权,让IOC容器来控制对象的实例化以及依赖关系的设置。
上图中还有一段关于IOC的伪代码。首先需要一个IOC容器,通过new去实例化一个,然后告诉容器其所需要控制的类的信息。在Process类里面通过某种配置或者声明的方式告诉IOC容器Process类里面需要依赖于Thread类。当向IOC容器请求一个Process对象的时候,IOC会实例化一个Process,同时也会实例化一个Thread类,根据Process里面声明的依赖将Thread设置到Process里面,并最终给用户一个可以正常运行的Process。
那么IOC是如何知道类的信息以及类之间的依赖关系的呢?现实的做法就是通过配置,配置可以为配置文件,也可以通过Java的注解进行实现。这样只需要定义类并通过配置声明依赖关系,就不用去关心类的对象的串接了,这些统统交由IOC进行处理,这样就简化了开发的工作量,同时通过配置可以灵活地配置对象之间的依赖关系。
这里还涉及到的一个概念就是依赖注入,依赖注入是一个比较易懂的概念。所谓的依赖注入就是将对象之间的依赖关系通过容器进行注入,避免在代码上直接设置依赖。其实依赖注入和控制反转表达的是同样的思想,但是依赖注入更加简洁明了,便于理解。
AOP

AOP,Aspect Oriented Programming,也就是面向切面编程。在AOP的概念里需要理解两个小的概念:切面和切点。

f3a01bf6e121f6e35438d2dfe5a521b1.png

首先,所谓切面就是刀切开之后所看到的平面,而切点则是刀切的位置。那么如何理解面向切面编程呢?在生活中的例子就是“肉夹馍”,在制作肉夹馍时首先需要将馍切开,之后在切面上放上肉并盖好,这样在吃的时候不仅能够吃到馍还能够吃到肉。而在做的时候需要关注这个馍应该怎么切,当然是横着切的,而且其切点位于边上,切完之后还需要选择放什么肉。
那么将Java中的类比喻成馍,那么类可以怎么切呢?其切点又在哪里呢?Java里面已经定义了类是可以切的,其切点只能是方法。将方法作为切点,那么其切面就只能是方法的前和后,那么所谓的肉就是需要添加的代码。那么在执行对象的方法时在进入方法前会执行切入的一段代码,在方法执行之后还会执行切入的另外一段代码,这样面向切面编程的理解就是将代码切入到类的指定方法、指定位置的编程思想。面向切面编程是面向对象编程思想的补充,可以通过面向切面编程将与类不相关的行为提取出来进行共享,并以切点的方式加入到不同的对象当中。一旦行为发生变化只需要修改行为而没有必要修改对象,其典型用法有日志打印、性能统计以及异常处理等。这里的日志打印就是当进入某一个方法的时候希望打印方法的一个参数信息,当退出方法的时候希望在日志中打印方法的返回值;性能统计就是统计方法的执行时间,在方法前记录一个时间戳,在方法后记录一个时间戳,以此得出方法的执行时间来统计方法的性能;异常处理可以定义该方法抛出异常的切面上面应该对于异常进行怎样的处理。


二、Spring Web开发

接下来将通过Spring Web的工程进行学习帮助大家了解如何快速开发Spring Web应用。在这个过程中也会加深大家对于IOC和AOP思想的理解。此外还将了解Web MVC架构模式的使用方式。

2c25748c56f611bda16de85c1bb31eea.png

在正式开始之前需要设计代码层级的结构,整个Spring Web工程将主要分为5个模块:view、controller、service、model和AOP,这些模块是具有层级关系的,view最靠近浏览器端,所以在层级上面属于最上层,浏览器发送请求并由controller响应请求并调用底下的service,由service层去操作数据,controller将得到service的返回结果并将数据传递给view层,最终view层输出给浏览器,而AOP将作为通用模块使用。
首先,示例工程使用Maven管理,这里首先定义了Spring Boot的依赖。Spring Boot是集成了Spring框架的开发套件,它将帮助开发者更快地开发Spring Web的应用。同时在依赖中还可以看到Web依赖、AOP依赖以及模板引擎Thymeleaf的依赖。

777ff3e7afb4bad00f71485bd4856f1b.png

示例工程下主要有aop包、controller包、model包和service包,这与前面所提到的代码层级模式是一致的。
下图所展现的是WebApplication主程序类,在WebApplication中存在一个main函数,而main函数中只有一句代码就是SpringApplication.run(),然后将WebApplication类的信息作为参数传递进去。那么SpringApplication.run()的背后就是Spring的核心,即IOC容器的初始化以及其他工作。在IOC容器初始化完成之后,将收到WebApplication类的信息,同时因为@SpringBootApplication注解,IOC容器将开启对demo包以及其下面的子包中所有类的扫描,通过扫描IOC容器将发现很多需要用到的类并将这些类注入进去。

2f87177b7edcfff391a3cdef05554dea.png

如下图所示的是UserController类,在其上面可以看到@Controller的注解,因为这个注解,UserController的信息将被注入到IOC容器中。在UserController中可以看到UserService的一个成员变量,这个成员变量在整个UserController并没有得到初始化。因为有一个@Autowired注解,这个UserController就可以在初始化之后会产生由于@Autowired注解声明的依赖,这个依赖将由IOC容器负责注入。其所注入的是UserService接口的实现。

1d769d77b2c0f8af11400f90a66e5939.png

对于UserService接口而言,其具有一个实现类,在实现类中有一个@Service注解,因为这个注解,UserService的实现类将被注入到IOC容器中,最终IOC容器可以初始化UserService的实现类的一个对象,并将对象注入到UserController里面,这样就可以通过IOC拿到一个完整的UserController对象,并且依赖已经自动装配好了。这也就是IOC的作用。在所有的代码中都没有UserService的实例化,这些都是由SpringBoot和IOC共同完成的。
在aop包下的LogAspect类里面可以看到面向切面的编程思想。首先在log()函数之前可以看到一个名为@Pointcut的注解,因为这个注解,这个log()函数将代表一个切点,同时可以看到在@Pointcut注解里面有一个表达式,该表达式标明了切点的位置,其将把demo.controller包下面的所有类以及所有公开的方法都作为切点进行切面编程。在doBefore()方法上面有一个函数注解,该注解就定义了一个切面,该切面位于切点之前,也就是在执行切点之前需要执行这段代码。同时还有一个切面是位于函数执行之后,将打印函数返回值输出的代码。


因为LogAspect的存在,将导致后续代码在执行controller里面的所有公有方法的时候都会在之前进行方法参数打印,以及方法后返回值的输出。这就是AOP面向切面编程思想所带来的好处。

5cfc7662aaf0101a580e9933b293413c.png

接下来将与大家分享WebMVC这种架构模式的使用,首先需要理解MVC中的M、V、C分别都代表什么。M指的是Model,也就是数据模型。如下图所示的User类,Model就是数据的载体。

c26343a112b81cd16481f94d8cca08af.png

V指的是View视图,在这里的视图是templates文件夹下定义的两个html模板文件,这些模板文件最终将由引入的依赖Thymeleaf模板引擎进行读。在这里其实可以将模板文件理解为Java的一个类。

8232bddf639fdd3adf7fc9e6eb81ee00.png

C也就是Controller控制器,如下图所示的UserController。

ebabfaca82bc776a3febae777f35d19c.png

接下来分享视图层、控制器的作用。首先,视图层的主要作用是将视图最终转化成一个包含真实数据的页面,并返回给浏览器由浏览器展现这个结果。控制器则主要是对请求进行响应,其会根据请求的地址和请求方式不同将请求分发到不同的方法上面,由方法执行对应的代码,然后对于请求做出对应的响应。
可以通过运行main函数执行整个Spring Boot程序,如下所示Spring Boot便已启动成功。Spring Boot在启动的时候就已经同时启动了一个Tomcat,Tomcat作为Web的容器,将可以对外提供Web服务,其将监听8080端口。根据端口以及UserController定义的地址可以通过浏览器进行访问。通过localhost:8080/users地址发起一个请求,在后台中由于做了切面编程,可以看到后台中UserController中的getUsers这个方法被执行了。而且这个方法的返回值是users。之所以会执行getUsers方法是因为在Controller中配置的@RequestMapping注解,当使用GET请求/users这个地址的时候,请求就会转发到这个方法中,这个方法会操作底层的users数据并返回,通过modelMap将数据和userList这个Key进行绑定并最终返回绑定的字符串users。由于框架的缘故,其会触发模板引擎来解释模板文件。同时由于modelMap的关系,它将给userList赋予后台的用户数据,在最终的模板文件里将会进行转化,使用真实的数据进行替代并渲染出真实的网页出来。

0e3f0f2384b4072c110826290c129e17.png

接下来可以尝试创建用户,在前端页面点击“创建用户”,后台将会调用相应的用户创建方法,其将有一个modelMap并将返回userCreate,由于模板的关系,其将会将modelMap中的数据带到模板中来,这个模板就是添加用户的页面,然后可以实现数据值的录入。

1722ee7e0fb0ff239dc03368bdd93beb.png

通过提交按钮将以POST方式请求,这样之后数据就添加成功了。

6c7869226f8a52a2d36c9f266ccba4c9.png

同时页面也已经重定向了用户列表的页面了。

45108299b25ec16797db9d4b7c745db1.png

可以看下后台的实现,首先调用了createUser方法,createUser方法将拿到由浏览器返回的录入的数据,并进行user创建。在具体进行创建的时候会插入一个具体的数据。在创建完成之后通过网页的重定向,让网页重新定向到users页面,进而触发一个新的请求并由getUsersPage重新响应,并返回users数据,并由模板引擎进行渲染进而显示一个真实的数据。整个请求的路由以及后端的MVC实现就是如上述所分析的。

a822cf6e37fd3a0b3ad527fd6b330cbe.png

其实在整个过程中都是在定义一个类,通过注解进行配置,在整个过程中并没有通过类实例化一个对象,这些都是因为控制反转的缘故交由IOC处理了。由于Spring Boot的缘故,也无需定义一个Tomcat,Spring Boot已经默认定义好了一个Tomcat来对外提供服务,这就是Spring Boot所带来的好处,可以帮助我们非常快速地开发Web的应用。

欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,学习能力的提升上有新的认识,欢迎转发分享给更多人。

猜你还想看

阿里、腾讯、百度、华为、京东最新面试题汇集

假如有人把支付宝存储服务器炸了(物理炸),大众在支付宝里的钱是不是就都没有了呢?

同步锁基本原理与实现,看这篇就够了!

Spring 如何解决循环依赖的问题

关注「程序员小乐」,收看更多精彩内容
嘿,你在看吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/433802.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git 代码回滚_能提交到远程的Git回滚

很多情况下我们需要回滚代码,最容易想到的就是git reset。但是git reset有个弱点,它是一个彻底的回滚,不能再提交给远程了,因为在提交记录里回滚点之后的记录都不见了。做一下试验,一个文件我们提交了三次之后回滚#往前…

Mysql数据库的几大优势

为什么开源社区买mysql的帐, MySQL数据库的吸引开源社区的几大特质: 客户为什么会考虑购买MySQL 企业版Enterprise Edition : 转载于:https://www.cnblogs.com/macleanoracle/archive/2013/03/19/2968208.html

c语言e怎么表示_来测测!这11个C语言入门基础知识你都掌握了吗?

文章字数:8400 干货指数:⭐⭐⭐⭐⭐C语言程序的结构认识用一个简单的c程序例子,介绍c语言的基本构成、格式、以及良好的书写风格,使小伙伴对c语言有个初步认识。例1:计算两个整数之和的c程序:#include main…

Oracle甲骨文8.7亿美元高价收购Eloqua

北京,2012年12月20日—— 甲骨文今天宣布,已与领先的云营销自动化和收入绩效管理软件供应商Eloqua公司(NASDAQ代码:ELOQ)达成收购协议,收购价为每股23.50美元,总额约为8.71亿美元。Eloqua的现…

hp服务器如何ghost系统,惠普(HP)电脑安装不了GHOST系统的解决办法

你还在为不知道惠普(HP)电脑安装不了GHOST系统的解决办法而不知所措么?下面来是学习啦小编为大家收集的惠普(HP)电脑安装不了GHOST系统的解决办法,欢迎大家阅读:惠普(HP)电脑安装不了GHOST系统的解决办法1、按F10进入CMOS2、找到电源设置项(Power Manag…

azm335x 串口配置

任务: 配置uart3和uart5 UART3 UART5 配置uart3 1. 修改mmu33xx.c _AM33XX_MUXENTRY(MII1_RXD3, 0, "mii1_rxd3", NULL, "rgmii1_rd3", "mmc0_dat5", "mmc1_dat2", NULL, "mcasp0_axr0", "gpio2_…

投影仪显示播放服务器连接异常,「投影仪维修」常见投影机故障如何解决?

投影机维修方法有哪些一、接通电源后无任何反应投影机在接通电源后,没有任何反应,说明投影机的电源供电部分很可能发生了问题。首先,你应该先检查一下投影机的外接电源规格是否与投影机所要求的标准相同,比方说要是外接电源插座没…

python画饼图程序_python使用matplotlib画饼状图

本文实例为大家分享了python使用matplotlib画饼状图的具体代码,供大家参考,具体内容如下 代码与详细注释 from matplotlib import pyplot as plt #调节图形大小,宽,高 plt.figure(figsize(6,9)) #定义饼状图的标签,标签…

我的世界服务器显示英文,我的世界pixelmon服务器技能显示英文

满意答案zihezimu2019.04.21采纳率:43% 等级:13已帮助:4603人解决神奇宝贝服务器在精灵对战中技能显示为英文,并且对战后名字显示为英文的问题心得 联机教程 1282 浏览1 评论殒天 Lv.7 猎手2017-2-18 09:49:51很多神奇宝贝服务…

python如果想测试变量的类型、可以使用_python里测试变量类型用什么

Python中测试变量类型可以使用isinstance()函数或type()函数来完成。 isinstance() 函数: isinstance()函数来判断一个对象是否是一个已知的类型,类似 type()。 isinstance()函数的语法:isinstance(object, classinfo) 参数: object -- 实例对…

平台系统云服务器配置,01-云平台连接配置

1云平台连接1.1 云平台连接简介云平台连接是指设备与H3C绿洲平台服务器(H3C Oasis server)通过Internet建立的远程管理通道。通过云平台连接,网络管理员可以在没有直接接入到设备所在网络的情况下,通过绿洲平台服务器对分布在不同地域的设备进行管理和维…

cocos2d-x for wp 之Box2D的应用

本文大部分内容是基于fengyun1989的博文,自己只是加深巩固而已 Box2d是一款用于2d游戏的物理引擎。在这个世界里创造出的物体都更接近于真实世界的物体。 首先,在项目添加Box2D.XNA.DLL。 新建一个页面BOX2DLayer并继承于CCLayer 重写init函数&#xff0…

python中集合运算_Python中的集合操作与集合运算

Python中的集合是一种无序的,无重复值的数据结构类型。Python中的集合可以用来检测元素检测或消除重复的元素。 一、python 集合概述 (1)Python中的集合元素是无序的,即元素没有顺序问题,也不能像数组、列表、字符串那…

Asp.net 定时任务

1.定时器 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.IO; using System.Text; using System.Web.Security; using System.Web.SessionState; using System.Timers;namespace WebApplication1 {public class Global :…

python程序怎么修改_python文件如何修改

以占用内存的方式修改文件 待修改的文件 word1.txt,文件内容如下:现在要将文中的“汪淼”修改为“WM”,代码如下:#!-*-coding:utf-8-*- old_str 汪淼 new_str WM f1 open(word1.txt,r,encoding"utf-8") #…

mysql 计算近30天总金额_mysql┃一条更新语句是怎么执行的???

本文共:3018字 预计阅读时间:8分钟文章首发于我的微信公众号:哪儿来的moon,欢迎大家关注mysql┃一条更新语句是怎么执行的???前言 通过上一篇文章的内容,大家已经对mysql的基本架构有…

arduinowifi.send怎么获取响应_ChatterBot代码解读-获取对话

这个过程比较复制,安装处理的流程,依次进行代码解读。在定义一个ChatBot后,可以进行对话的训练,这个过程参考:水中的鱼:ChatterBot代码解读-训练数据​zhuanlan.zhihu.com然后就是用如下的代码&…

beautifulsoup网页爬虫解析_Python爬虫神器:PyQuery,解析网页更简单,小白也能学会

图/文:迷神我们做python爬虫,通过requests抓取到内容就需要正则匹配,或者其他解析库解析内容。很多可能和我一样的人,都使用jquery的,那用的还是非常爽的。而pyquery库就是jQuery的Python实现,能够以jQuery…

unityios开发--加载视频以及加载完成之后自动跳转 .

在做游戏或者是虚拟漫游一般都会用到在开始的时候加载一段视频,这个视频可能一个介绍整个游戏或者是整个项目的。在加载完了之后自动的跳转到主画面或一个场景,在前在网上百度了一下找到的大部分都是win的好不容易找到了ios的。 Unity3D中播放游戏视频的…

rnn神经网络模型_一文读懂序列建模(deeplearning.ai)之循环神经网络(RNNs)

作者:Pulkit Sharma,2019年1月21日翻译:陈之炎校对:丁楠雅本文为你详细介绍序列模型,并分析其在不同的真实场景中的应用。简介如何预测一个序列中接下来要发生什么事情是一个非常吸引人的课题,这是我对数据…