SpringBoot

springBoot 的基础结构一共三个文件

* src/main/java 程序开发以及主程序入口
* src/main/resources 配置文件
* src/test/java 测试程序

配置文件:

pom 文件中一些依赖的解释

### springboot 将功能场景抽取出来,做成一个个的starters。
* spring-boot-starter 
    * 包括自动配置支持
    * 日志
    * YAML
    * 如果引入了 spring-boot-starter-web  可以去掉此配置,因为web模块自动依赖了spring-boot-starter
* spring-boot-test 测试模块
    * Junit
    * Hamcrest 书写匹配器对象时允许直接定义匹配规则的框架,大量的是侵入式的。但是匹配对象在书写灵活的测试是最常用的
    * Mocito 是一个mocking框架,让你用简单干净的API写漂亮的测试代码。Mockito不会让你混乱 ,因为测试代码具有非常好的可读性,Mockito可以创建纯净的环境来进行代码功能的验证。

注解的解释

* @SpringBootApplication
    *  说明这个类是Spring Boot的主配置类,
    *  运行这个类的main方法启动sringboot 应用
* @SpringBootConfiguration 
    * springboot 的配置类
* @EnableAutoConfiguration 字如其意 ,自动配置类。可以在配置文件中启用debug=true属性来让控制台自动配置报告。
    * 作用:
        1. 给容器中导入一些组件
            * 将类路径下 META-INF/spring.factories 里面配置的所有EnableAutoConfiguration 的值加入到容器中。这样每一个xxxAutoConfiguration 类都是容器中的一个组件,用它们来做自动配置类
* @PropertySource 加载指定的配置文件
* @ImportResource 导入spring的配置文件,让里面的配置文件生效
    * springboot 更推荐用注解的方式来给容器中添加组件;推荐使用全注解的方式
* @Configuration 表明当前类是一个配置类,来代替spring配置文件(beans.xml)
* @Bean 通常使用@configuration注解的时候会用到它,将方法的返回值添加到容器中,默认的id就是方法名。
* junit 测试中用到的
    * @RunnerWith(SpringRunnner.calss) 表命用spring的驱动器来运行
    * @SpringBootTest 表面是一个单元测试

配置文件简介

* 作用:
    * 修改springBoot 自动配置的默认值,同时也可以注入数据
1. application.properties 可以在测试期间进行类似编码一样的自动注入等容器功能。

2. application.yml
    1. 基本语法:
        1. k: V : 用来表示一对键值对(中间必须有空格)
        2. 属性和值都是大小写敏感的
        3. 字符串默认不用加单引号和双引号
            * "" :双引号  它里面的特殊字符 (如 \n)输出的时候会变为换行的意思
            * '' : 单引号  它里面写的是什么字符,输出的就是什么字符,没有特殊的,万物平等
        4. 可以写对象
            1. 需要注意缩进
                friends:
                    lastname: zhujingwen
                    age: 20
        5. 也可以写数组
            list:
                - a
                - b
                - c

javaBean 上面的注解

* @ConfigurationProperties(prefix = "person")
    * 这个主要是用来对bean 对象进入注入(就是将applicaton.yml 里面的 对象person 的信息注入到这个bean里面)
* @Component 也要标注在配置类上面,因为配置类也是容器中的一个组件。它的作用是创建一个容器
* 可以导入配置文件处理器 spring-boot-configuration-processor 以后编写配置时就有提示了
* @Value 和@ConfiurationProperties 获取值的比较
    1. 一般在业务逻辑中需要获取一个配置文件中的某个值,就使用@value
    2. 如果专门编写了一个javaBean来和配置文件进行映射,就用@ConfigurationProperties
    3. @ConfigurationProperties 
        1. 可以注入配置文件中的属性
        2. 支持松散绑定(松散语法)
            * -person.firstName: 标志方式
            * -person.first-name: 大写用-
            * person.first_name 大写用_
            * PERSON_FIRST_NAME 推荐系统属性使用这种写法
        3. 不支持 SpEL
        4. 支持JSR303数据校验,数据校验一定要用它
            *   比如校验用户名是邮箱格式时,就一定要用这种格式
    4. @Value
            1. 需要一个个指定赋值对象
            2. 不支持松散绑定
            3. 支持SpEL
                * 可以用表达式赋值
            4. 不支持数据校验
            5. 不支持复杂类型封装

多Profile 文件

* 在主配置文件编写的时候,文件名可以为 application-{profile}.peoperties/yml
* 默认使用application.properties 的配置
* yml 支持多文档的方式
    * springboot 使用snakeymal 解析yml 文件
    * 可以直接在yml文件中指定多种环境
    * 多个文档需要用- - -隔开。(也就是一个application.yml文件中有多个文档)
* 激活指定profile 
    1. 在配置文件中指定 可以在文档后面用 active: 指定的文件的名字 来激活改文档
    2. 命令行的方式
        * java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;
        * 可以直接在测试的时候,配置传入命令参数
    3. 虚拟机参数
        1.  -Dspring.profiles.active=dev

配置文件加载位置

* springboot 启动会扫描一下位置的application.properties或者application.yml文件作为SpringBoot的默认配置文件
    1. file:/config/
    2. file:/
    3. classpath:/config/
    4. classpath:/
    * 它们优先级从高到底,高优先级的配置会覆盖低优先级的配置。springBoot会从四个位置全部加载主配置文件,来互补配置
    * 也可以通过spring.config.location来改变默认的配置文件的位置,也就是在项目打包好后,使用命令行参数的形式,在启动项目时指定配置文件的新位置。
### 外部配置加载顺序
    1. 命令行参数
    2. 来自java:comp/env的JNDI属性
    3. Java系统属性(System.getProperties())
    4. 操作系统环境变量
    5. RandomValuePropertySource配置的random.*属性值
    6. jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
    7. jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
    8. jar包外部的application.properties或application.yml(不带spring.profile)配置文件
    9. jar包内部的application.properties或application.yml(不带spring.profile)配置文件
    10. @Configuration注解类上的@PropertySource
    11. 通过SpringApplication.setDefaultProperties指定的默认属性
    * 后面的规则主要是
        * 从有profile到无profile寻找
        * 由jar包外向jar包内进行寻找
    * 注意:
        * 所有的配置都可以在命令行上进行指定,多个配置之间用空格分开:格式为: jar包名字 --配置项1=值1 配置项2=值2
        * 使用spring.config.location 时系统只会加载指定配置文件的内容,包内的配置文件会互补
        * 

配置文件中的占位符

* 配置文件中可以使用随机数
    * ${random.value}、${random.int} 、${random.long}
    * eg: ${random.int(1.0)}、
    * 属性也可以配置占位符
        * 可以在配置文件中引用前面配置过的属性,只要是前面配置过的属性,都能用
        * ${app.name:默认值} 可以用来指定找不到属性时的默认值

springboot的日志管理

1.日志抽象层: JCL ,SLF4J,Jboss-logging
2.日志实现: Log4j     Log4j2    JUL     Logback
3.apacghe下的:    
    * Log4j   
    * JUL
        JCL 定义一套日志接口    内部提供一个Simple Log 的简单实现,
        底层可以是Log4j 也可以是JUL
    * slf4j
    * Logback


    * Log4j2

项目中使用 SLF4j 和LogBack

SLF4j 还可以与其他日志的实现框架组合
使用的时候要导入 slf4j 的jar包 和它实现类的 jar包

spring 和Hibrnate 和Mybatis 底层都使用了不同的日志框架
统一日志框架的办法
- 将系统中其他日志框架先排除出去
- 用中间包来替换原有的日志框架
- 导入slf4j 其他的实现包
    偷梁换柱大法: 替代的日志的jar包虽然名字跟slf4j 有关,但是内部的包名依然是原先的包名。然而当创建时,LogFactory 实例化时创建的也是SLF4JlogfFactory。 作者就是通过这种方式实现了偷梁换柱,以达到日志框架的统一的目的。
* spring boot 默认日志级别是info及以后的级别,可更改在配置文件中可以更改:                          logging.level.root=debug
1.可以在application.properties 文件中进行设置
    logging.level.root=debug
2.可设置指定包文件下的日志级别
        logging.level.com.hand=trace
* 配置日志文件位置
    1.只指定文件名
        使用 logging-file 指定文件名
            logging.file=
    2. 指定文件路径+文件名
    3.指定文件路径
        logging.path=
* 配置日志格式(也是在 application.properties或者application.yml中配置的)
    1) 控制台日志格式
        logging.pattern.console=
    2) 更改文件日志格式
        logging.pattern.file=
Spring Boot 日志默认配置原理及高级特性
    默认配置原理:源码中可以找到对相应的日志框架的基本配置
    添加指定配置
        :1. 在资源文件夹下添加相关框架的配置文件
        添加logback.xm和logback-spring.xml 区别
        第一个是被底层框架Logback识别,第二个是被springBoot识别加载,它支持<springProfile>
        标签来设置不同环境的日志配置
- 在项目中使用SLF4J :
    - 首先导入SLF4J 和Logback的jar包
        - 由于SLF4J本身并无实现,所以需要导入实现类的jar包
    - 在代码中使用时:
        - import org.slf4j.Logger;
            import org.slf4j.LoggerFactory;

            public class HelloWorld {
                    public static void main(String[] args) {
                        Logger logger = LoggerFactory.getLogger(HelloWorld.class);
                        logger.info("Hello World");
                    }
            }

* 使用日志框架的高级功能步骤:
    * 只需要在资源文件夹(resources)下添加相关框架的配置文件
    * SpringBoot支持添加<springProfile/>标签设置不同环境的日志配置。

SpringBoot 与Web开发

* 主要分为以下三步:
1. 创建springboot 模块时最好选中, web、数据库、mybatis等
2. SpringBoot已经默认上一步中所选场景配置好了,全部在External Libraries里,只需要在配置文件中指定少量配置就可以运行起来。如web配置:
3. 编写业务层代码

Spring Boot 对静态资源的映射规则

* 一般的web应用会将静态页面放到webapp下,但是springBoot 是一种打包为jar的方式,因而页面的css文件放在哪,springBoot有自己的规定
* Spring Boot MVC的相关配置都在WebMvcAutoConfiguration里面,该文件在web自动配置里下的servelt里,此处重点了解WebMvcAutoConfiguration里的addResourceHandlers方法,即添加資源映射
1. 规则一: 引入公共资源: 
    1. 所有 /webjars/**,都去classpath:/META-INF/resources/webjars/ 找资源。这我们不用其实不用管,因为自动导入maven依赖,需要的时候自己就会去找。我们可以直接用
2.  规则二: 引入自添加的资源
    * ”/**“ 访问当前项目的任何资源,若没出来,则去(静态资源的文件夹)去找映射
    * 静态资源文件夹如下:
        * classpath:/META-INF/resources/
        * classpath:/resources/
        * classpath:static/
        * classpath:/public/
        * "/" :当前项目的根路径
3. 规则三: 欢迎页
    1. 静态资源文件夹下的所有 index.html页面,被”/**“映射
    2. 在没有添加index.html时,访问localhost:8080会找不到页面
4. 规则四: 所有的 **/favicon.ico都是在静态资源文件夹下找(浏览器前面地址栏图标)
5. 可以在配置文件(application.properties/yml)下面自定义静态资源文件夹
    1. 使用: spring.resources.static-locations配置,多个文件用 ,逗号隔开 .
    2. 当定义了自定义的静态资源文件夹之后,原有的静态资源文件夹就不用了

模板引擎(重点)

* 由于创建的项目时以jar包方式而不是web方式,并且使用的是嵌入式的tomcat,所以默认是不支持jsp页面的。如果直接用纯静态的html页面进行开发,会非常麻烦。所以Spring Boot推荐用户使用模板引擎。如:JSP、Velocity、Freemarker、Thymeleaf 。
* springboot 推荐用户使用Thymeleaf 。一个现代化的java服务端模板引擎

使用Thymeleaf

1. 引入Thymeleaf
    在pom文件中添加依赖
2. Thymeleaf 规则
    1. 它的自动配置规则在 spring-boot-autoconfigure 里面,我们需要根据配置规则来使用Thymeleaf。Thymeleaf的配置规则封装在ThymeleafProperties里面
    2. thymeleaf 渲染
        1. 由规则可以看出,我们只要把HTML 页面放在classpath:/themplates/, thymeleaf 就能自动渲染
    3. 语法规则
        1. 简单使用:
            1. 导入thymeleaf 的名称空间,首先在html页面加入  <html lang="en" xmlns:th="http://www.thymeleaf.org">,作用是提示代码
            2. 抓取请求域数据
                1. 通常情况下,我们获取值用${xxx},在Thymeleaf中,利用th:text改变当前元素里面的文本内容,如div,需要注意的是,div和th之间是空格。  
                <div th:text="${抓取的属性名}"></div>
        2. th:任意html属性来替换原生属性的值。
            * 如一个div里有id属性,class属性等,我们可用th:id th:class等来替换原生属性。
        
        3. 语法表达式:
            1. Variable Expressions: ${...}:获取变量值
            2. Selection Variable Expressions: *{…} 选择表达式:和${}在功能上是一样
            3. Message Expressions:  #{...}:获取国际化内容
            4. Link URL Expressions: @{...}:定义URL
            5. Fragment Expressions: ~{...}:片段引用表达式   

使用SpringMVC 自动配置

待学习
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容