SpringBoot实战读书笔记

创建一个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的自动配置功能。
实际上改注解是将三个注解组合在一起。

  1. @Configuration
    表明该类是使用spring的基于java的配置
  2. @ComponentScan
    启用spring的组件扫描
  3. @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优先级更高。

  1. 修改嵌入式服务器的配置:
    启动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
  1. 配置日志
    可以在classpath的根目录(src/main/resources)里面创建log4j.xml的日志配置文件。在application.yml中设置属性。
  2. 配置数据源
    配置数据库的url和身份信息
spring:
  datasource:
    url:jdbc:mysql://localhost/readinglist
    username:admin
    password:admin
    driver-class-name:com.mysql.jdbc.Driver
  1. 通过Profile设置环境变量
    通过在application.yml配置文件中设置:
spring:
  profiles:
    active:production

为每个环境分别创建设置:
可以通过application-{profile}.properties或者application-{profile}.yml这种命令格式来创建特定环境的配置。

  1. 自定义应用程序错误页面
    springboot自动配置为应用提供了一个错误页面,在程序遇到错误的时候显示。
    springboot默认提供的“whitelabel”的错误页面。
    如下:


    springboot默认错误页面

深入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

你可能感兴趣的:(SpringBoot实战读书笔记)