今天开始不断整理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"%>
Message:${message}page1.jsp文件源代码:
<%@pagelanguage="java"pageEncoding="UTF-8"%>
${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,因为它必须保证有序Map