1.微服务与Springboot
微服务:一个项目可以由多个小型服务构成(微服务)
Spring boot 可以快速开发微服务模块(简化j2ee开发;整个spring技术栈整合如spring mvc 、spring;整个j2ee技术整合如整合mybatis Struts2)
2.第一个SpringBoot程序及执行原理
(1)需要配jdk及maven环境
(2)目录结构resources:
static存静态资源(js css 图片)
Templates:模板文件(freemarker,thymeleaf,默认不支持jsp)
- spring boot将各个应用/三方框架 设置成了一个个“场景”stater,选完之后,spring boot 会将该场景所需要的所有依赖自动注入,例如选择“web”,例如选择“web”,spring boot 就会将web相关的依赖全部引入本项目。如(tomcat json包等)
- @SpringBootApplication:spring boot的主配置类。该注解包含:@ SpringBootConfiguration:包含@Configuration,表示“配置类”
代替spirng.xml。且该类会自动化放入spring容器。
- EnableAutoConfiguration:是SB自动配置。(如将主应用程序包下的类,自动注入)可以找到@SpringBootApplication所在类的包。(自己写的包)
SB在启动时,会根据META-INF/spring.factories找到相应的三方依赖,并将这些依赖引入本项目。(三方依赖)
总结:编写项目时,一般会对自己写的代码以及三方依赖进行配置。但是springboot可以自动进行配置。
自己写的代码,sb通过@SpringBootConfiguration自动帮我们配置。 三方依赖,通过spring-boot-autoconfig-2.0.3Release.jar中的META-INF/spring.factories,该jar包中包含了 J2EE整合体系中需要的依赖。
如何自动装配:研究org.springframework.boot.autoconfigure.web.servlet.httpEncodingAutoConfiguration源码发现:@Configuration:标识此类是一个配置类,将此类纳入spring IOC容器。@EnableConfigurationProperties(HttpEncodingProperties.class):通过HttpEncodingProperties将编码设置为UTF_8,(即自动装配为UTF_8,如何修改编码:在配置文件中设置spring.http.encoding.charset=GBK)。
@ConditionalOnProperty(prefix = “spring.http.encoding”, value =”enable”,matchIfMissing = true)
当属性满足要求时,此条件成立:要求为如果spring.http.encoding.enable=xxx没有配置则成立。即每一个XxAutoConfiguration 都有很多@ConditionOnXxx,当这些条件都满足时,则此配置自动生效(utf-8)。
如何知道springboot开启或禁止哪些自动装配?
在application.properties,添加debug = true配置,
重启之后positive matches为自动启动,negative matches为自动禁止的。
3.配置文件及yml使用
- 配置文件,作用:spring boot自动配置(约定,8080),可以使用配置文件对默认的配置进行配置。默认的全局配置文件,如application.properties : k=v;
application.yml 不是一个标记文本;注意:a. K:空格V。 b.通过垂直对其指定层次关系。
c.默认不写引号,
Xml:是一个标记文档,<server> <port>8882</port> </server>
- Yaml通过@ConfigurationProperties和@Value方式注入值。
绑定:
@Compont
@ConfigurationProperties(prefix=”student”)
Public class Student
注值:@ConfigurationProperties为批量注入,@Value单个注入。
- @PropertySource:默认会加载application.properties/application.yml文件中数据。例如@PropertySource(value={“classpath:conf.properties”}),加载conf.properties.但是@PropertySource只能加载properties,不能加载yml。
- @ImportResource
Spring boot 自动装配/自动配置。Spring等配置文件,默认会被spring boot自动给配置好。自己编写的spring等配置文件,sb默认不识别,如果需要识别,则需要通过@ImportResource指定配置文件的路径。但不推荐手写配置文件,spring boot 推荐使用注解方式进行配置:@Configuration @Bean
- spring boot 全局配置文件中的占位符表达式,如:
a、随机数 ${random.uuid}等
b、引用变量值
Yml中:
Student:
uname:x
name:${student.user.name}
实际引用的是properties中的student.user.name=z167
4.springBoot多环境设置及切换
- 多环境的切换(profile)
- Properties
默认boot会读取application.properties环境,多个application-环境名.properties,如application-dev.properties 8883.
如果要选择某一个具体的环境:application.properties中指定:spring.profiles.active=(dev)环境名,如果将application.properties注释掉,spring boot仍会读取其他 application-环境名.properties
- yml
第一环境(主环境)
Server:
Port:8888
Spring
profiles:dev 环境名
- 动态切换环境
通过运行参数指定环境:
- sts(Eclipse):Run Configuration -Argument - program Argument
--spring.profiles.active=环境名
- 命令行方式:
Java -jar 项目名.jar --spring.profiles.active=环境名。
通过vm参数指定环境:
Sts(Eclipse):run configuration -Argument -VM
-Dspring.profile.active=环境名
5.springBoot配置文件位置及加载顺序
(1)位置
Properties和yml中的配置,相互补充;如果冲突,则properties优先级高。
Spring boot默认能够读取的application.properties/application.yml,这两个文件可以存在于以下4个地方:
File:项目根目录/config
File:项目根目录
Classpath:项目根目录/config
Classpath:项目根目录
注意:如果某项配置冲突,则优先级从上往下。如果不冲突,则互补结合使用。
(2)外部配置文件及加载顺序问题
在properties文件中配置项目名: server.servlet.context-path=/boot.
项目外部的配置文件:
在项目Run configuration ,argumenets:
--spring.config.location =文件路径
如果同一配置同时存在于内部配置文件和外部配置文件,则外部>
内部。
通过命令行,调用外部配置文件
Java -jar 项目.jar --spring.config.location=D:/app.properties.
更新项目运行参数:(补救)
在项目run configuration, arguments
--server.port = 8883
通过命令行,调用外部配置文件。
Java -jar 项目.jar --server.port=8883.多个地方配置时,如果冲突优先级为:命令参数(调用外部的配置文件>运行参数>内部文件)
6.Spring boot日志处理
(1) 日志框架 UCL JUL JBOSS-logging logback log4j log4j2
(2)Spring boot默认选用slfj.logback
(3)Spring boot默认帮我们配置好了日志,我们直接使用即可。
日志级别: trace<DUBUG<INFO<WARN<ERROR<FATAL<OFF
(4)Spring boot默认的日志级别是info(即只打印info及之后的级别信息),也可自定义级别;全局配置可以通过配置将日志信息存储到文件中 logging.file =D:/springboot.log。存储到项目的根目录中的,也可以指定具体的日志路径:logging.path =D:/springboot.log;也可以存储到一个文件夹,logging.path=D:/log/,并默认的文件名是spring.log。
(5)指定日志显示格式:
a、日志显示在console中
Logging.pattern.console = %d {yyyy-MM-dd} [%thread] % -5level %logger{50}
%d:日期时间
%thread:线程名
%-5level:显示日志级别,-5表示从左显示5个字符宽度。
%logger{50}:设置日志长度
%msg:日志消息
%n:回车
b、日志显示在文件中
Logging.pattern.file =%d{yyyy-MM-dd} ** %-5level **%logger..
默认的日志格式,是在jar包中相应包的xml文件中进行配置。
日志具体的使用规范,在springboot 官方资料中查看,https://docs.spring.io/spring-boot/docx/2.0.4.RELEASE/reference
7.Springboot 处理web静态资源
- springboot开发web项目(静态资源 html css js)
New - spring starer -设置(选择 需要的场景 ,web)
Spring boot 是一个jar,因此静态资源就不是再存放到webapps中,存放在哪里?
静态资源的存放路径 通过webMvcAutoConfiguration类-addResourceHandlers()指定:/webjars
Spring boot将静态资源存放到jar包中,引入:从jar目录结构的webjars开始写:http://localhost:8080/webjars/jquery/3.3.1-1/jquery.js
- 如何自己写静态资源,如何放到如spring boot中?将自己写的静态资源->jar,同上(不推荐)
推荐:spring boot约定 ,spring boot将一些目录结构 设置成静态资源存放目录,我们的静态资源直接放入这些目录即如:
classpath:/META-INF/resources/
Classpath:/resources/
Classpath:/static/
Classpath:/public/
注意:在以上目录存放资源文件后,访问时不需要加前缀,直接访问即可。如:http://localhost:8080/word.html
8.WebMvcAutoConfiguration源码解读
(1)设置欢迎页:webMVCAutoConfiguration类中welcomePageHandlerMapping() -->getIndexHtml()-->location +”index.html”;
(2)网站中网页标签的Logo是固定名字:favicon.ico,自定义favicon.ico,阅读源码得知,只需要将favicon.ico文件放入任意静态资源目录中即可。
总结:1、通过源码发现静态资源的目录 2、用静态资源:只需要将静态资源放入以上目录即可。 3、其他特定的文件(欢迎页,ico),只需要根据约定(index.html favicon.ico)放入该
- 如何自定义静态资源目录(properties文件中的prefix+属性):
Spring.resources.static-locations=classpath:/res/,”classpath:/img/”
以上就将静态资源目录设置为了classpath:/res/,classpath:/img/,注意自定义静态资源目录后,动态资源:jsp(Spring boot默认不支持)。推荐:模板引擎。
9.模板引擎thymeleaf
- 网页=模板+数据
- 引入thymeleaf:到官网查询 thymeleaf的依赖(maven
- 使用thymeleaf:代码在哪里写?
thymeleafAutoConfiguration、XxProperties
使用thymeleaf只需要将文件放入目录:“classpath:/templates/”;文件的后缀:“.html”
注意:在以前传统的web项目中,静态资源修改后是不需要重启的;但是在spring boot项目中修改后需要重启。
例如:<p th:text=”${welcome}”> welcome to thymeleaf..</p>以上,先从${welcome}中取值,如果有th就是替换原来html值:
10.SpringBoot整合外置Tomcat及使用JSP开发
若需要使用JSP需要外置Tomcat并打成War包,
- 更改tomcat依赖关系
- 建立必要web目录结构,如webapps/WEB-INF(需要)
- 新建boot项目,war
注意:
<dependency>
<groupId> org.springframework.boot<groupId>
<artifactId>spring-boot-starter-tomcat<artifactId>
<scope>provided</scope>
<dependency>
Provided:意思是将项目打包时,不需要将内置的tomcat一起打包。
- 建立基本的web所需的目录结构
webapps/WEB-INF(需要)
Webapps/WEB-INF/web.xml(不需要)
Webapps/index.jsp
- 创建tomcat实例,部署项目
访问: 域名/项目名/文件名 例如:http://localhost:8080/SBJSP/index.jsp
分析:
如果是一个war包的spring boot项目,在启动服务器tomcat时,会自动调用ServletInitializer类中的configure方法,configure方法会调用spring boot的主配置类,从而启动spring boot。即启动tomcat服务器时,会启动tomcat及springboot。