阅读spring boot一些笔记
1.spring boot精要
spring boot 将很多的魔法带入到了spring应用的程序之中
-
自动配置:
针对很多的spring应用程序常见的应用功能,spring boot能够提供相关的配置 -
起步依赖:告诉spring boot需要什么功能,他就可以引入什么库;一个依赖包含多个依赖
-
命令行界面:
-
actuator:提供在运行时检视应用程序内部情况的能力
spring boot 就是spring,他做了哪些没有他你自己也会去做的spring bean配置。
spring initializr:本质就是web应用程序,为你生成spring boot项目结构
2.spring boot 项目
- 启动引导spring
- Application.java
@SpringBootApplication
public class DemoTestMqttWebApplication {
public static void main(String[] args) {
SpringApplication.run(DemoTestMqttWebApplication.class, args);
}
}
可以观察以上的一段代码此段代码的主要作用
- 配置
- 虽然spring boot 自动配置免除了很多的spring配置,但是还是需要少量的配置来启动自动配置
- 启动引导
- @SpringBootApplication
- 开启组件扫描和自动配置
- 实际上此注解将三个有用的注解结合在一起
1. @Configuration:
表明该类使用基于java的配置,虽然本书不会写太多的配置,但是我们更倾向使用java而不是xml配置
2.@componentScan
启用组件扫描
3.@EnableAutoConfiguration
这是个了不起的小注解,开启了自动配置
类写配置
如果你需要spring boot自动配置以外的其他spring配置,一般来说,最好把他写到单独的@Configuration标注的类里面(组件扫描会发现并使用这些类),但是在嫉妒简单的情况下,你是可以写在application.java这个类里面的!
配置应用程序的属性
application.properties(存在就会被加载)
- 一个空的文件。
- 实际上这个文件是可有可无的,你大可以删掉它,这不会对应用程序有影响,但是留着也没啥问题
server.port=8000
添加这个会导致监听端口变成8000
使用起步依赖
- 要想理解spring boot使用起步依赖的好处,先让我们假设他们尚不存在。如果没有用spring boot,你会向项目中添加哪些依赖呢?要用springMVC你会向项目中添加什么依赖呢?
- 看来如果没有spring boot起步以来,你就有不少的功课要做。
- 你想做的无非就是开发一个spring web应用程序,但是要支持你的计划,需要往构建说明里面添加不少东西呢!
- 当你整完这些依赖的时候肯定还有个问题就是这些依赖他们兼容吗
覆盖起步依赖引入的传递依赖
通俗的说 就是你对自己引入的依赖不满意(可能是版本,或者是不需要这个依赖),那么我们可以排除这个依赖,为我们的项目瘦身。
- 在maven工程里面 我们可以使用
<dependency>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
</exclusion>
</exclusions>
</dependency>
- 如果起步依赖里面不是你想要的版本,我们同样有办法对这个进行处理
- 我们只需要直接pom中表达自己的诉求就可以
- maven总是会用最近的依赖(我就想用比起步依赖版本更低的怎么办呢这个问题只能先去除起步依赖然后自行添加)
- 你说需要做的就是直接在项目中添加依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jack-databind</artifactId>
<version>2.4.3</version>
</dependency>
- 在我目前看到的这本书里面,作者是不推荐覆盖spring boot的起步依赖的
- 作者自己认为spring boot里面的起步依赖之间的兼容性都是经过测试的,也就是说靠谱
- 我觉得也是,有现成的,自己就不要瞎搞!!
使用自动配置
废话太多 ,我也懒得说,反正就是那个意思
- spring boot的自动配置是一个运行时的过程。
3.自定义配置
- 自动配置有时候不能完全满足我们的要求,也就是说你这种配置不是我的菜,我就不爱吃肉,你为什么要给我加肉呢?
- 在这里我们可以采用两种方式对spring boot的自动配置进行操控
- 使用显示配置进行覆盖
- 使用属性进行精细化配置
覆盖spring boot自动配置
保护应用程序
- spring boot 自动配置让应用程序的安全工作变得易如反掌
- 你所需要做的就是添加security起步依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
- 下面重新运行程序 你就会发现一个很蛋疼的问题,一个http基础身份验证的对话框就出来了
- 主要问题是密码还是随机生成的,试想:你总不能要求用户每次访问应用程序还得查看日志寻求密码吧。。。
- 所以,我们就需要修改spring security的一些配置,至少要好看的一些登录页,还要有一个基于数据库用户存储的身份验证服务
为了达到我们的目的,我们接下来必须重新自定义security的配置,目的就是覆盖spring boot的自动配置
说明:对于spring security后续将会有具体demo,这里我只是想说明自定义配置的概念,不想搞代码
创建自定义的安全配置
- 覆盖自动配置是很简单的,我们可以就当自动配置是不存在的
直接显示的写一段配置。 - 这段显示配置的形式不限
- 在编写显示配置时,我们会专注于java形式的配置
掀开自动配置的神秘面纱
- spring boot 自动配置自带了很多配置类,每一个都可以运用在你的程序里面。
- 他们都使用了spring4.0 的条件化配置,可以在运行时判断这个配置是该被运行还是被忽略
- 在这里我还得说几句条件化配置,以前我都没听过,唉。。。
- 其实我是很想说几句的,但是发现也没啥好说的
- 你需要知道的是@conditionalOnMissingBean这个注解是覆盖自动配置的关键就可以了
通过属性文件外置配置
- 在处理应用安全时候,你当然会希望完全掌控所有的配置。下面我就是想说但是,为了微调一些细节,比如说:端口号。日志级别啥的。
- 我们可以这样想:为了修改一个数据库的url,是配置一个属性简单呢,还是完整的声明一个数据源的bean简单呢?我都不想废话了
接下来又出现了一个问题,这些微调的属性写在哪里呢
- 可以写的地方太多了,我也懒得全部说,下面就推荐两种吧也是大家常用的,个人喜欢第一种
- application.properties
比如:
server.port=8000
- application.yml
server:
port:8000
自动配置微调
配置日志
- 大多数的应用程序都提供了某种形式的日志。
- 即使你的应用程序不会直接记录日志,你所使用的库也会记录它们的活动
- 在默认的情况下,spring boot会用logback来记录日志,并且用info级别输出到控制台。
- 当然了萝卜青菜各有所爱,你就是喜欢log4j或者是log4j2,那我还能怎么办呢?还得满足您的要求,这时候我们可以如下:
1.首先去除默认日志的起步依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-start</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
2.添加自己想要使用的日志依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
</dependency>
- 当然了,如果你想要完全的掌握日志的配置,那么我们也是提供了方法
- 可以在classpath的根目录(src/main/resource)里面创建logback.xml
- 其实,这个logback的配置和不加logback.xml的默认配置差不多。但是我就要强调一点,通过编辑logback.xml你可以完全掌握应用程序的日志文件。
- 常规的完全可以写在application.properties里面,还是看个人习惯吧
- 如果你想要完全的掌握日志的配置,但是又不想logback.xml作为日志配置的名字。我们可以通过logging.config=classpath:log4j2.xml
配置数据源
- spring boot自带数据源,和连接池
- 但是我们也是可以使用自己的指定的连接池
- 虽然你可以显示的配置自己的datasource bean,但是通常我们不这么干
- 只要简单的通过属性配置数据库的url和身份信息就可以了
- 通常你也不要指定jdbc驱动,spring boot会更具url识别出来需要的驱动
配置数据源
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url = jdbc:mysql://192.168.1.168:3306/mqtts?userSSL=true
spring.datasource.username = root
spring.datasource.password = zhaodi123
spring.datasource.driverClassName=com.mysql.jdbc.Driver
配置连接池
初始化大小,最小,最大
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20
配置获取连接等待超时的时间
spring.datasource.maxWait=60000
配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.datasource.timeBetweenEvictionRunsMillis=60000
配置一个连接在池中最小生存的时间,单位是毫秒
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT?1?FROM DUAL
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
打开PSCache,并且指定每个连接上PSCache的大小
spring.datasource.poolPreparedStatements=true
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
spring.datasource.filters=stat,wall,log4j
通过connectProperties属性来打开mergeSql功能;慢SQL记录
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
合并多个DruidDataSource的监控数据
spring.datasource.useGlobalDataSourceStat=true