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插件。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>                                            <!--从spring-boot-starter-parent继承版本号-->
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>springboot_demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>      <!--起步依赖-->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

起步依赖

如果没有起步依赖,我们需要像项目中添加我们应用需要的各种依赖,还要考虑各种依赖的版本之间能否兼容。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的起步依赖。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

通过JMX监控应用程序
Actuator把它的端点以MBean的方式发布出来了,可以通过JMX来查看和管理。
定制Actuator:
重命名端点
启用和禁用端点
自定义度量信息
创建自定义仓库来存储跟踪数据
插入自定义的健康指示器
1.修改端点id

endpoints:
  shutdown:
    id:kill

2.启用和禁用端点

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

推荐阅读更多精彩内容