创建一个springboot项目
使用idea创建springboot项目
由于我使用的是社区版的,所以在File选项->New project选择Spring Assistant,如果列表中没有这个选项,可以在settings下的plugins中搜索安装并重启idea。
我们的项目名为springboot_demo,包名为com.example.demo
项目中的DemoApplication.java文件是应用程序的启动引导类,也是spring的配置类。
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@SpringBootApplication注解作用是开启了spring的组件扫描和springbooot的自动配置功能。
实际上改注解是将三个注解组合在一起。
- @Configuration
表明该类是使用spring的基于java的配置 - @ComponentScan
启用spring的组件扫描 - @EnableAutoConfiguration
启用springboot的自动配置
如果你的应用需要springboot自动配置以外的其他spring配置,一般来说,最好将它写到一个单独的@Configuration标注的类中。
使用maven来构建应用程序,在创建项目的时候会自动生成一个pom文件,其中使用了springboot的maven插件。
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.2.1.RELEASE
com.example
springboot_demo
0.0.1-SNAPSHOT
demo
Demo project for Spring Boot
1.8
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine
org.springframework.boot
spring-boot-starter-thymeleaf
org.springframework.boot
spring-boot-starter-data-jpa
org.springframework.boot
spring-boot-starter-security
com.h2database
h2
org.springframework.boot
spring-boot-maven-plugin
起步依赖
如果没有起步依赖,我们需要像项目中添加我们应用需要的各种依赖,还要考虑各种依赖的版本之间能否兼容。springboot中提供了众多的起步依赖,起步依赖的本质上就是一个pom文件,定义了对其他库的依赖传递,很多起步依赖的命名都暗示它能提供某种或某类功能。
例如web应用的起步依赖spring-boot-starter-web,spring data jpa的起步依赖是spring-boot-starter-data-jpa等有很多起步依赖。
如果不想要起步依赖引入的传递依赖的版本号,我们可以在项目的pom中覆盖起步依赖引入的传递依赖的版本号,因为maven采用的是最近依赖原则。
自动配置
springboot的自动配置是
例如:
spring的jdbcTemplate是不是在classpath中?如果是,并且有datasource的bean,就会自动配置一个jdbcTemplate的Bean。
Thymeleaf是否在classpath中?如果是,则配置Thymeleaf的模板解析器、视图解析器以及模板引擎。
条件化配置:允许配置存在于应用程序中,但是在满足某些特定条件之前都忽略这个配置。
springboot中定义的条件化注解
@conditionalOnBean 配置了某个特定的Bean
@ConditonalOnMissingBean 没有配置某个特定的Bean
@ConditionalOnClass classpath中有指定的类
@ConditionalOnMissingClass classpath中缺少指定的类
.......等等。
springboot利用条件化配置实现自动配置:
例如:
因为classpath中有spring MVC,所以会配置spring的dispatcherServlet并启用springMVC。
因为classpath中有tomcat,所以会启动一个嵌入式的tomcat容器,监听8080端口。
因为classpath中有spring Data JPA,所以会自动配置为根据仓库的接口创建仓库实现。
自定义配置
大多数情况下,自动配置的Bean刚好能满足我们的需要,不需要去覆盖它们,但是在某些情况下,springboot在自动配置的时候还不能很好的进行推断。
例如,当你在应用程序里添加安全特性时,自动配置做的还不够好,安全配置并不是放之四海而皆准的,围绕程序安全还有很多的决策要做,springboot并不能够替我们做,虽然spring boot能够帮我们提供一些基本的自动配置,但还是需要自己覆盖一些配置来满足特定的安全要求。
如果想要覆盖springboot的自动配置,你要做的就是编写一个显式的配置。
如何覆盖自动配置?
@ConditionalOnMissingBean注解是覆盖自动配置的关键
例如:springboot中的DataSourceAutoConfiguration中定义的jdbcTemplate Bean,
@Bean
@ConditionalOnMissingBean(JdbcOperations.class)
public JdbcTemplate jdbcTemplate(){
return new JdbcTemplate(this.source);
}
@ConditionalOnMissingBean注解表示在当前没有jdbcOperations类型的Bean时才生效,如果当前已经有一个jdbcOperations类型(JdbcTemplate实现了该接口)的Bean了,就会不执行jdbcTemplate()方法。
Springboot时先加载应用级的配置,随后再考虑自动配置类。
通过属性文件外置配置
springboot自动配置的bean提供了300多个用于微调的属性,当调整设置的时候,只要在环境变量、java系统属性、JNDI、命令行参数或者属性文件中修改。
例如只是要设置数据库的url,重新声明一个数据源的Bean肯定没有配置一个属性简单。
springboot设置属性的途径有很多中:
命令行参数、java:comp/env里的JNDI属性、JVM系统属性、操作系统环境变量、应用程序意外的application.properties或者application.yml文件、打包在应用程序中的application.properties或者application.yml文件、通过@PropertySource标注的属性源、默认属性。这些途径是按照优先级排序的,优先级高的属性会覆盖优先级低的相同的属性。
可以创建配置文件application.properties或者application.yml的YAML文件,文件可以放置的位置有:
(1)外置,相对于程序运行目录的/config子目录
(2)外置,在应用程序运行的目录
(3)内置,在config包内
(4)内置,在classpath根目录
上面位置的是按照优先级排序的,/config目录中的application.properties文件会覆盖classpath中的application.properties中相同的属性,此外,在同一优先级位置同时有application.properties和application.yml,则application.yml优先级更高。
- 修改嵌入式服务器的配置:
启动springboot应用程序的时候,会启动一个嵌入式的服务器,监听8080端口,但是如果启动多个应用程序,都监听8080端口,会存在端口冲突,因此可以通过设置端口属性来修改监听的端口。
server:
port:8000
有时候可能还要开启服务器的https服务,可以在配置文件中进行配置。
server:
port:8000
ssl:
key-store:file:///path/to/mykeys.jks //存放密钥的路径
key-store-password:letmein //创建密钥文件时给定的密码
key-password:letmein
- 配置日志
可以在classpath的根目录(src/main/resources)里面创建log4j.xml的日志配置文件。在application.yml中设置属性。 - 配置数据源
配置数据库的url和身份信息
spring:
datasource:
url:jdbc:mysql://localhost/readinglist
username:admin
password:admin
driver-class-name:com.mysql.jdbc.Driver
- 通过Profile设置环境变量
通过在application.yml配置文件中设置:
spring:
profiles:
active:production
为每个环境分别创建设置:
可以通过application-{profile}.properties或者application-{profile}.yml这种命令格式来创建特定环境的配置。
-
自定义应用程序错误页面
springboot自动配置为应用提供了一个错误页面,在程序遇到错误的时候显示。
springboot默认提供的“whitelabel”的错误页面。
如下:
深入Actuator
springboot的Actuator,提供了很多生产级的特性,例如监控和度量springboot应用程序。
springboot的actuator提供了多个端点:
/autoconfig :提供自动配置报告,记录哪些自动配置条件通过了,哪些没有通过。 GET
/configprops :描述配置属性如何注入Bean。GET
/beans:描述应用程序上下文中的全部Bean,以及它们的关系。GET
/dump:获取线程活动的快照。GET
/env:获取全部环境属性:GET
/env/{name}:根据名称获取特定的环境属心值。GET
/health:报告应用程序的健康指标。GET
/info:获取应用程序的定制信息。GET
/mappings:描述全部URI路径,以及它们和控制器的映射关系。GET
/metrics:报告各种应用程序度量信息,如内存使用量和http请求技术等。GET
/shutdown:关闭应用程序,要求endpoints.shutdown.enabled=true。POST
/trace:提供基本的HTTP请求跟踪信息(请求头,时间戳等)。GET
如果要启用Actuator端点,需要在pom中假如actuator的起步依赖。
org.springframework.boot
spring-boot-starter-actuator
通过JMX监控应用程序
Actuator把它的端点以MBean的方式发布出来了,可以通过JMX来查看和管理。
定制Actuator:
重命名端点
启用和禁用端点
自定义度量信息
创建自定义仓库来存储跟踪数据
插入自定义的健康指示器
1.修改端点id
endpoints:
shutdown:
id:kill
2.启用和禁用端点
endpoints:
metrics:
enabled:false
如果只是想打开一两个端点,可以先禁用全部端点,然后启用我们自己想要的那几个
endpoints:
enabled:false
metrics:
enabled:true