SpringBoot快速入门篇CharyGao

今天开始不断整理SpringBoot2.0版本学习笔记,大家可以在博客看到我的笔记,然后大家想看视频课程也可以到【慕课网】手机app,去找【SpringBoot2.0深度实践】的课程,令人开心的是,课程完全免费!

SpringBoot是由Pivotal团队提供的全新框架。SpringBoot是所有基于SpringFramework5.0开发的项目的起点。SpringBoot的设计是为了让你尽可能快的跑起来Spring应用程序并且尽可能减少你的配置文件。

设计目的:用来简化新Spring应用的初始搭建以及开发过程。

从最根本上来讲,SpringBoot就是一些库的集合,它能够被任意项目的构建系统所使用。它使用“习惯优于配置”(项目中存在大量的配置,此外还内置一个习惯性的配置)的理念让你的项目快速运行起来。用大佬的话来理解,就是springboot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,springboot整合了所有的框架,总结一下及几点:

(1)为所有Spring开发提供一个更快更广泛的入门体验。

(2)零配置。无冗余代码生成和XML强制配置,遵循“约定大于配置”。

(3)集成了大量常用的第三方库的配置,SpringBoot应用为这些第三方库提供了几乎可以零配置的开箱即用的能力。

(4)提供一系列大型项目常用的非功能性特征,如嵌入式服务器、安全性、度量、运行状况检查、外部化配置等。

(5)SpringBoot不是Spring的替代者,Spring框架是通过IOC机制来管理Bean的。SpringBoot依赖Spring框架来管理对象的依赖。SpringBoot并不是Spring的精简版本,而是为使用Spring做好各种产品级准备

(1)Maven安装:

(2)Maven配置环境变量:

解压到一个路径,然后配置环境变量:

(3)检查是否配置成功:

在命令行输入:

(4)配置maven仓库:

1.打开maven文件夹下的config文件夹下的settings.xml;2.找到localRepository标签,此时是被注释掉的,我们解除注释,然后配置一个路径,例如:D:/space/MavenRepository/maven_jar,这样以后MAVEN管理下载的jar包都会在这个路径下。【注意】:注意结点的位置,先找到注释掉的部分,贴在下面

3.配置远程仓库,找到mirrors标签

4.当然我们需要先建这样一个目录结构,然后还要把settings.xml复制一份到D:/space/MavenRepository下

第一步:新建SpringInitializr项目:

(3)然后选择默认的url(不用管)点击【Next】:

(4)然后填写一下项目的信息:

(7)选择好项目的位置,点击【Finish】:

(7)如果是第一次配置SpringBoot的话可能需要等待一会儿IDEA下载相应的依赖包,默认创建好的项目结构如下:

项目结构还是看上去挺清爽的,少了很多配置文件,我们来了解一下默认生成的有什么:

第二步:HelloController

在【main/java/com.xpwi.springboot】包下新建一个【HelloController】:

packagecom.xpwi.springboot;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;/***测试控制器**@author:@肖朋伟CSDN*@create:2018-11-18*/@RestControllerpublicclassHelloController{@RequestMapping("/hello")publicStringhello(){return"HelloSpringBoot!";}}第三步:利用IDEA启动SpringBoot

(1)我们回到SpringbootApplication这个类中,然后右键点击运行:

(3)注意:我们之所以在上面的项目中没有手动的去配置Tomcat服务器,是因为SpringBoot内置了Tomcat等待一会儿就会看到下方的成功运行的提示信息:

(4)此时,可以看到我们的Tomcat运行在8080端口,我们来访问下面地址试一下:

一、解析pom.xml文件:

(1)让我们来看看默认生成的pom.xml文件中到底有些什么:

关于具体SpringBoot提供了哪些jar包的依赖,我们可以查看本地Maven仓库下:\repository\org\springframework\boot\spring-boot-dependencies\2.1.0.RELEASE\spring-boot-dependencies-2.1.0.RELEASE.pom文件来查看,挺长的…

二、应用入口类SpringbootApplication.java

SpringBoot项目通常有一个名为*Application的入口类,入口类里有一个main方法,这个main方法其实就是一个标准的Javay应用的入口方法。

@SpringBootApplication是SpringBoot的核心注解,它是一个组合注解,该注解组合了:@Configuration、@EnableAutoConfiguration、@ComponentScan;若不是用@SpringBootApplication注解也可以使用这三个注解代替。

三、SpringBoot的配置文件:

SpringBoot使用一个全局的配置文件application.properties或application.yml,放置在【src/main/resources】目录或者类路径的/config下。

SpringBoot不仅支持常规的properties配置文件,还支持yaml语言的配置文件。yaml是以数据为中心的语言,在配置数据的时候具有面向对象的特征。

SpringBoot的全局配置文件的作用是对一些默认配置的配置值进行修改。

修改properties配置文件实例:

(1)打开resources下的application.properties

注意:如果是yml需要在“:”后加一个空格,幸好IDEA很好地支持了yml文件的格式有良好的代码提示;我们可以自己配置多个属性

(3)使用yml文件作为配置文件,我们直接把.properties后缀的文件删掉,使用.yml文件来进行简单的配置

(4)在然后使用在我们的HelloController.java类中使用@Value来获取配置属性,代码(请看注释):

【注意】:此时如果你第一次使用idea出现中文乱码,解决办法:

(6)【注意】:我们并没有在yml文件中注明属性的类型,而是在使用的时候定义的。你也可以在配置文件中使用当前配置:

(7)任然可以得到正确结果:

(8)【问题】:这样写配置文件繁琐而且可能会造成类的臃肿,因为有许许多多的@Value注解。

可以,封装配置信息

(2)新建author.java和HelloController.java同级,内容如下:

packagecom.xpwi.springboot;importorg.springframework.boot.context.properties.ConfigurationProperties;importorg.springframework.stereotype.Component;@Component@ConfigurationProperties(prefix="author")publicclassauthor{privateStringname;privateStringcsdnUrl;publicStringgetCsdnUrl(){returncsdnUrl;}publicvoidsetCsdnUrl(StringcsdnUrl){this.csdnUrl=csdnUrl;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}}(3)此时可能会报错,如果报错,打开pom.xml文件,添加内容(注意位置):

(4)重新编写HelloController类,内容如下:

packagecom.xpwi.springboot;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.boot.context.properties.ConfigurationProperties;importorg.springframework.stereotype.Component;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;/***测试控制器**@author:@肖朋伟CSDN*@create:2018-11-18*/@RestControllerpublicclassHelloController{//获取.yml文件中值//@Value("${name}")//privateStringname;//获取age//@Value("${csdnUrl}")//privateStringcsdnUrl;@Autowiredprivateauthorauthor;//路径映射,对应浏览器访问的地址,访问该路径则执行下面函数@RequestMapping("/hello")publicStringhello(){return"名字:"+author.getName()+"地址:"+author.getCsdnUrl();}}(5)重启SpringBoot,访问浏览器:

【提示】:我们可以把配置信息封装成一个类,首先在我们的name和age前加一个student前缀,然后新建一个StudentProperties的类用来封装这些信息,并用上两个注解:

在目前的SpringBoot项目中,当发生了任何修改之后我们都需要重新启动才能够正确的得到效果,非常麻烦,SpringBoot提供了热部署的方式,当发现任何类发生了改变,就会通过JVM类加载的方式,加载最新的类到虚拟机中,这样就不需要重新启动也能看到修改后的效果了。

pom.xml是Maven的配置文件,当我们需要使用其他的支持的时候,经常需要在这里配置

(1)在pom.xml的dependencies中添加内容:

2.在pom.xml的plugins中添加内容::

(4)重新启动SpringBoot,然后修改任意代码,只需要在浏览器刷新就能看到更新,控制台的也会有自动重启现象:

上面已经完成了SpringBoot项目的简单搭建,我们仅仅需要进行一些简单的设置,写一个HelloController就能够直接运行了,不要太简单…接下来我们再深入了解一下SpringBoot的使用。

SpringBoot加入JSP支持

SpringBoot的默认视图支持是Thymeleaf模板引擎,但是这个我们不熟悉啊,我们还是想要使用JSP怎么办呢?

(1)修改pom.xml增加对JSP文件的支持

(3)配置试图重定向JSP文件的位置修改application.yml文件,将我们的JSP文件重定向到/WEB-INF/views/目录下:

(4)创建上面的目录,和index.jsp,page1.jsp两个测试jsp文件,内容:文件较多注意目录结构:

index.jsp文件源码:

<%@pagelanguage="java"pageEncoding="UTF-8"%>SpringBootSampleTime:${time}
Message:${message}page1.jsp文件源代码:

<%@pagelanguage="java"pageEncoding="UTF-8"%>SpringBootSample

${content}

(5)创建JspController.java(注意目录,看上面截图)JspController.java文件源代码(看注释):

(2)访问:

(3)访问:

提示:banner.txt必须是ANSI编码的,一般工具创建会是UTF-8,会显示不出来

使用SpringBoot开发时,当程序启动的时候控制台会输出由字符组成的Spring符号。这个是SpringBoot为自己设计的Banner:

._________/\\/___'_____(_)______\\\\(()\___|'_|'_||'_\/_`|\\\\\\/___)||_)|||||||(_||))))'|____|.__|_||_|_||_\__,|////=========|_|==============|___/=/_/_/_/::SpringBoot::(v2.0.5.RELEASE)所有的springboot程序启动时都是输出spring,这是不是太单调了。那么输出一些有个性的符号,或者输出公司的名字是不是更有意思?

我应该怎么个性化定banner呢?

这个很简单只需要两步!

代码:

本篇也会非常详细的介绍涉及的基础知识点,更多都写在注释上了

(1)打开创建项目窗口,点击CreateNewProject

请查看详细注释,根据自己的项目修改

注意:

(2)启动类App.java源代码:

packagecom.xpwi.main;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context.annotation.ComponentScan;importorg.springframework.web.bind.annotation.RestController;importjava.util.Date;/***描述:SpringBoot多模块测试项目*@authorXiaoPengwei*@since2019-03-25*/@SpringBootApplication@RestController//扫描main,test模块中的下的所有包//在pom加载子模块依赖才可以骚包@ComponentScan({"com.xpwi.main","com.xpwi.test"})publicclassApp{publicstaticvoidmain(String[]args){//启动Web容器SpringApplication.run(App.class,args);System.out.println("[启动成功]"+newDate());}}(3)MainController.java文件源代码:

(2)TestController文件源代码:

手写Api文档的几个痛点:

Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。Swagger让部署管理和使用功能强大的API从未如此简单(其他好处网上自己搜在这里就不再多说了)。

本篇内容:

(1)构建多模块项目(可选单模块步骤)(2)pom.xml配置加载依赖(3)Swagger配置类(Bean)(4)启动类配置(5)创建工具类(6)User实例类(7)定义restful接口(Controller层)

为帮助快速入门上手使用,提供了简单的增删改查,使用的参数配置示例

本篇测试环境:

如果想使用多模块,请先构建项目(建议):

如果不想使用多模块(下面模块请根据自己项目修改)

Springboot项目都会有一些依赖,为了更直观,只贴必要的部分为你的SpringBoot项目再增加下面两个依赖:pom.xml配置:

用@Configuration注解该类,等价于XML中配置beans;用@Bean标注方法等价于XML中配置bean不是不可以使用xml,提倡使用注解,是不是想起点什么?

SwaggerConfig.java源代码:

packagecom.xpwi.main;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context.annotation.ComponentScan;importorg.springframework.web.bind.annotation.RestController;importspringfox.documentation.swagger2.annotations.EnableSwagger2;importjava.util.Date;/***描述:SpringBoot多模块测试项目*@authorXiaoPengwei*@since2019-03-25*/@EnableSwagger2@SpringBootApplication@RestController//扫描main,test模块中的下的所有包//在pom加载子模块依赖才可以扫包@ComponentScan({"com.xpwi.main","com.xpwi.test","com.xpwi.login"})publicclassApp{publicstaticvoidmain(String[]args){//启动Web容器SpringApplication.run(App.class,args);System.out.println("[启动成功]"+newDate());}}第五步:创建工具类用于返回通用数据格式的工具类CommonResult.java源代码:

packagecom.xpwi.main.util;/***描述:通用返回类型*@authorXiaoPengwei*@since2019-03-27*/publicclassCommonResult{privateStringstatus;privateObjectresult;privateObjectmessage;publicStringgetStatus(){returnstatus;}publicvoidsetStatus(Stringstatus){this.status=status;}publicObjectgetResult(){returnresult;}publicvoidsetResult(Objectresult){this.result=result;}publicObjectgetMessage(){returnmessage;}publicvoidsetMessage(Objectmessage){this.message=message;}}第六步:User实例类User模拟对应数据库字段的实体类User.java源代码:

packagecom.xpwi.main.entity;importjava.util.Date;/***描述:User实体类*@authorXiaoPengwei*@since2019-03-27*/publicclassUser{privateStringid;privateStringusername;privateintage;privateDatectm;publicStringgetId(){returnid;}publicvoidsetId(Stringid){this.id=id;}publicStringgetUsername(){returnusername;}publicvoidsetUsername(Stringusername){this.username=username;}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.age=age;}publicDategetCtm(){returnctm;}publicvoidsetCtm(Datectm){this.ctm=ctm;}}第七步:!定义restful接口(Controller层)最重要的一步,也是开发中最常用的一步创建UserController.java源代码:

swagger提供的常用的注解有:

如果项目上线并且需要关闭swagger接口,可以通过配置权限,或者再SwaggerConfig里面returnnewDocket的时候加多一个.enable(false)

测试环境(test):一般是克隆一份生产环境的配置,一个程序在测试环境工作不正常,那么肯定不能把它发布到生产机上。

生产环境(prod):是值正式提供对外服务的,一般会关掉错误报告,打开错误日志。

三个环境也可以说是系统开发的三个阶段:开发->测试->上线,其中生产环境也就是通常说的真实环境。

用途:一般在resources中进行多套配置,自由切换

.properties和.yml都可以作为配置文件,我个人比较喜欢yml配置,比较直观。当然配置项比较少的时候.properties文件也挺好用,总之都得会了解,下面记录一下yml文件中需要注意的地方

现在我们的application.properties文件内容是:

server.port=8090server.session-timeout=30server.context-path=server.tomcat.max-threads=0server.tomcat.uri-encoding=UTF-8spring.datasource.url=jdbc:mysql://localhost:3306/数据库名serverTimezone=UTCspring.datasource.username=rootspring.datasource.password=rootspring.datasource.driverClassName=com.mysql.cj.jdbc.Driver#SpecifytheDBMSspring.jpa.database=MYSQL#Showornotlogforeachsqlqueryspring.jpa.show-sql=true#Hibernateddlauto(create,create-drop,update)spring.jpa.hibernate.ddl-auto=update#Namingstrategyspring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy#strippedbeforeaddingthemtotheentitymanager)spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect而官方给的很多demo,都是用yml文件配置的。yml文件的好处,天然的树状结构,一目了然。不过当时把application.properties改成application.yml还是痛苦了一会儿。

下面是置换后的application.yml内容:

server:port:8090session-timeout:30tomcat.max-threads:0tomcat.uri-encoding:UTF-8spring:datasource:url:jdbc:mysql://localhost:3306/数据库名serverTimezone=UTCusername:rootpassword:rootdriverClassName:com.mysql.cj.jdbc.Driverjpa:database:MYSQLshow-sql:truehibernate:ddl-auto:updatenaming-strategy:org.hibernate.cfg.ImprovedNamingStrategyproperties:hibernate:dialect:org.hibernate.dialect.MySQL5Dialect注意点:(1)原有的key,例如spring.jpa.properties.hibernate.dialect,按“.”分割,都变成树状的配置

(2)key后面的冒号,后面一定要跟一个空格!!

(3)把原有的application.properties删掉。然后一定要执行一下maven-Xcleaninstall

刚知道JPA可以根据实体类,生成数据库表,特此记录

pom配置:

spring.datasource.url=jdbc:mysql://localhost:3306/testserverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=truespring.datasource.username=rootspring.datasource.password=rootspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.jpa.database=mysqlspring.jpa.show-sql=truespring.jpa.hibernate.ddl-auto=updatespring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect需要先配置数据库连接,然后创建实体类UserInfo:

原因:test中的测试类的包名和java下的包名不一致导致,找不到

解决方法一(建议):

将test中的测试类包名改成和上面一致

解决方法二:

在注解上指定启动类

@SpringBootTest(classes=Application.class))Springboot使用Shiro模板引擎时使用swagger-ui时的问题先不管为啥技术栈混乱,遇到问题了描述一下,Shiro

添加路径处理器,当一个swagger-ui.html请求过来,既要经过权限认证,是不是模板引擎的模板,是不是静态资源的重重处理,服务器也不知道它要要干啥了。

@ConfigurationpublicclassWebMvcConfigimplementsWebMvcConfigurer{@OverridepublicvoidaddResourceHandlers(ResourceHandlerRegistryregistry){registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");}}这样一个配置,并且shiro放行了swagger-ui.html,但是我发现配置后还是打不开,但起码它不会再被指定到static路径了,后来发现,其实是shiro没有放行swagger所需的资源,仅放行swagger-ui.html是不够的,于是:

@BeanpublicShiroFilterFactoryBeanshiroFilterFactoryBean(DefaultWebSecurityManagersecurityManager){ShiroFilterFactoryBeanbean=newShiroFilterFactoryBean();//---------省略------//filterChainDefinitions拦截器map必须用:LinkedHashMap,因为它必须保证有序MapfilterMap=newLinkedHashMap<>();//配置不会被拦截的链接filterMap.put("/swagger-ui.html","anon");filterMap.put("/swagger-ui.html/**","anon");filterMap.put("/swagger-resources/**","anon");filterMap.put("/webjars/**","anon");filterMap.put("/v2/**","anon");//添加shiro过滤器bean.setFilterChainDefinitionMap(filterMap);logger.info("Shiro拦截器工厂类注入成功");returnbean;}

THE END
1.Datatype(redirected fromDatatype) Also found in:Medical,Encyclopedia. data type n. 1.In programming, a classification identifying one of various types of data, as floating-point, integer, or Boolean, stating the possible values for that type, the operations that can be done on that type, and the https://www.thefreedictionary.com/datatype
2.datatype是什么意思datatype的用法翻译读音海词词典,最权威的学习词典,专业出版datatype是什么意思,datatype的用法,datatype翻译和读音等详细讲解。海词词典:学习变容易,记忆很深刻。http://m.dict.cn/msearch.php?q=datatype
3.数据结构中datatypex是什么意思数据结构中datatype x是什么意思 推荐内容数据结构中datatype x是什么意思来自匿名用户的提问 回答 最佳答案 datatype x数据类型为 datatype,抽象的数据类型。 2017-10-05 1 更多回答(1)? 2025 SOGOU.COMhttps://wenwen.soso.com/z/q812649670.htm
4.mysql中的datatype是什么问答在MySQL中,datatype(数据类型)是用来定义表中的列所能存储的数据类型的规范。MySQL支持各种数据类型,包括整数、浮点数、字符串、日期、时间等。通过指定适当的数据类型,可以确保数据在数据库中被正确存储和处理。MySQL中常用的数据类型包括: 整数类型(INT,TINYINT,SMALLINT,MEDIUMINT,BIGINT) 浮点数类型(FLOAT,DOUBLEhttps://www.yisu.com/ask/91083872.html
5.datatype是什么意思翻译datatype的意思用法例句沪江词库精选data type是什么意思、英语单词推荐、中英文句子翻译、英语短语 【计】数据类型;资料类型 相似短语 data type 【计】数据类型;资料类型 data type 【计】数据类型;资料类型 abstract data type 抽象数据类型 basic data type 基本数据类型 char data type 字符数据类 numeric data type 【计https://www.hujiang.com/ciku/data_type/
6.typedef怎么用typedefintDatatype什么意思?typedef什么意思?怎么Typedef表示重命名类型。typedef struct是什么意思?struct是struct typedefintDatatype什么意思?typedef什么意思?怎么用?有没有具体点系统点的解释? Typedef表示重命名类型。 typedef struct是什么意思? struct是structure的关键字,用于定义结构,typedef是定义自定义类型的关键字。您可以定义自定义类型。Typedef enum定义枚举https://www.kmw.com/news/3207146.html
7.decimaldatatypedecimal是什么意思decimaldatatypedecimal的中文翻译,decimaldatatypedecimal是什么意思,怎么用汉语翻译decimaldatatypedecimal,decimaldatatypedecimal的中文意思,decimaldatatypedecimal的中文,decimaldatatypedecimal in Chinese,decimaldatatypedecimal的中文,decimaldatatypedecimal怎么读,发音,例句,用法和解释由查查在线词典提供,版权所有违者必究。https://www.ichacha.net/decimaldatatypedecimal.html
8.Python中data是什么意思python中datatype的作用Python中data是什么意思 python中datatype的作用 1 根据Python对数据类型的定义:"objects are Python's abstraction for data, and all data in a Python program is represented by objects or by relations between objects"。 Python中一切皆对象,包括整数,浮点数和布尔值。在Java中,这些是“primitive数据类型”,https://blog.51cto.com/u_16099234/11663156
9.mustbeemptytochangedatatype的翻译是:什么意思?中文column to be modified must be empty to change datatype问题补充:匿名 2013-05-23 12:21:38 要修改的列必须是空变化的数据类型 匿名 2013-05-23 12:23:18 要修改必须是空栏,改变数据类型: 匿名 2013-05-23 12:24:58 将被修改的专栏一定是空的改变datatype 匿名 2013-05-23 12:26:38 http://www.zaixian-fanyi.com/fan_yi_5061652
10.python中datatype是什么意思pythondatatypenotespython中datatype是什么意思_python datatype notes 本文详细介绍了Python中的数据类型,包括数字和字符串。数字类型包括整型、浮点型、布尔型等,提供了多种内置函数进行操作。字符串是有序字符集合,不可变,支持多种方法如strip()、split()等。此外,还讨论了二进制、八进制和十六进制的转换。https://blog.csdn.net/weixin_39591916/article/details/110565532
11.abstractdatatype是什么意思英语解释 abstract data type abstract data type是什么意思、abstract data type怎么读 abstract data type汉语翻译 【计】 抽象数据类型https://www.dancihu.com/yinghan/a/abstractdatatype2528.htm
12.enum在java中是什么意思java教程用于表示数据类型(例如:DataType、FieldType) 枚举的优势 使用枚举有以下优势: 可读性和可维护性:枚举为常量提供了一个清晰且可读的命名空间,提高了代码可维护性。 类型安全:枚举强制类型安全,防止使用无效值。 定制方法:枚举允许定义定制的方法和字段,增强了其功能性。 https://www.php.cn/faq/766646.html
13.C语言数组的定义和使用(非常详细)其中,dataType 是每个元素的类型,比如 int、float、char 等;dataType 是数组的名字,它是一个自定义的标识符,符合标识符的命名规则;方括号[ ]中的length 是数组的长度,也即数组包含的元素的个数。 来看个简单的例子: int nums[4]; 这样就定义了一个名为 nums 的数组,它包含 4 个 int 类型的元素。再比https://c.biancheng.net/view/qt05wgt.html