Spring Boot 笔记

新建 Spring Boot 项目

这个部分 Idea,Spring Boot 官网工具都能够创建 Spring Boot 项目,这里省略。

Spring Boot 工程的 pom.xml

新建的 Spring Boot 工程项目中的 pom.xml 文件有父依赖。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.9.RELEASE</version>
</parent>

这块配置就是Spring Boot父级依赖,有了这个,当前的项目就是Spring Boot项目了,spring-boot-starter-parent是一个特殊的starter,它用来提供相关的Maven默认依赖,使用它之后,常用的包依赖可以省去version标签。

继续看 spring-boot-starter-parent 的 pom.xml 文件,可以看到它还有父依赖。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>1.5.9.RELEASE</version>
    <relativePath>../../spring-boot-dependencies</relativePath>
</parent>

spring-boot-dependencies 的 pom.xml 文件中我们才看到了定义的一些第三方包的版本属性信息。

<properties>
    <!-- Dependency versions -->
    <activemq.version>5.14.5</activemq.version>
    <antlr2.version>2.7.7</antlr2.version>
    <appengine-sdk.version>1.9.59</appengine-sdk.version>
    <artemis.version>1.5.5</artemis.version>
    <aspectj.version>1.8.13</aspectj.version>
    <assertj.version>2.6.0</assertj.version>
    <atomikos.version>3.9.3</atomikos.version>
    ...
</properties>

这里只截取了一部分,完整的大家可以看一下 spring-boot-dependencies 的 pom.xml。

spring-boot-dependencies 中还定义了一些 starter。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>1.5.9.RELEASE</version>
    </dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <version>1.5.9.RELEASE</version>
</dependency>
...

这个就是我们在 Spring Boot 项目中,添加了父依赖之后,添加 starter 和 一些第三方包的时候不用填写 version 的秘密。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.9.RELEASE</version>
</parent>

如果你不想使用 Spring Boot 指定的第三方包的版本,你可以在自己的项目中定义第三方依赖项的版本来覆盖 Spring Boot 指定的版本。比如 spring-boot-dependencies 中指定了 logback 的版本为 1.1.11

<logback.version>1.1.11</logback.version>

现在我们想在自己的项目中使用 logback 的版本是 1.2.3 ,可以在自己的项目 pom.xml 文件 properties 中重新指定一下 logback 的版本即可。

<properties>
    <logback.version>1.2.3</logback.version>
    ...
</properties>

当然并不是每个人都愿意继承 spring-boot-starter-parent 这个父依赖的。这个可能是因为自己公司会提供标准的 parent 父依赖(比如笔者公司就使用 inf-bom 来指定公司基础组件的版本信息)。如果遇到这种情况,不能依赖 spring-boot-starter-parent ,但是又想使用 spring-boot-starter-parent 提供的依赖管理功能,这样就可以不用写 version 了,这个时候可以通过使用 scope = import 依赖关系来保持依赖关系管理:

<dependencyManagement>
     <dependencies>
        <dependency>
            <!-- Import dependency management from Spring Boot -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>1.5.9.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

使用这种方式来管理依赖关系时,如果想使用自定义第三方版本时,不能使用前面提到的在自己的项目 pom.xml 文件 properties 中重新指定一下第三方 jar 包版本。要实现相同的结果,您需要在 spring-boot-dependencies 项之前的项目的 dependencyManagement 中添加一个配置,例如,要升级到另一个 logback 版本,您可以将以下内容添加到pom.xml 中。

<dependencyManagement>
    <dependencies>
        <!-- Override Spring Data release train provided by Spring Boot -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>1.5.9.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Spring Boot 的配置文件

Spring Boot使用了一个全局的配置文件application.properties,放在src/main/resources目录下或者类路径的/config下。Sping Boot的全局配置文件的作用是对一些默认配置的配置值进行修改。

自定义属性

com.elvis.name="懒癌正患者"
com.elvie.wish="希望世界和平"

然后直接在要使用的地方通过注解@Value(value=”${config.name}”)就可以绑定到你想要的属性上面

@RestController
public class UserController {

    @Value("${com.elvis.name}")
    private  String name;
    @Value("${com.elvie.wish}")
    private  String wish;

    @GetMapping("hello")
    public ResultView hello() {
        return ResultView.builder().data(name + wish).build();
    }
}

此时在浏览器中访问这个路径就能看到响应结果

{
  "code": 0,
  "message": "success",
  "data": "懒癌正患者希望世界和平"
}

但是当自定义的配置属性比较多,使用这种方式来一个一个绑定到属性上,是不是很麻烦

@Value("${com.elvis.name}")
private String name;
@Value("${com.elvie.wish}")
private String wish;

这个时候可以定义一个配置类,这里我定义为 ElvisConfig , 顶部需要使用注解 @ConfigurationProperties(prefix = "com.elvis")来指明使用哪个

@Data
@ConfigurationProperties(prefix = "com.elvis")
public class ElvisConfig {

    private String name;

    private String wish;

}

这里配置完还需要在 Spring Boot 入口类加上@EnableConfigurationProperties并指明要加载哪个bean。

@SpringBootApplication
@EnableConfigurationProperties({ElvisConfig.class})
public class Aggregation {

    public static void main(String[] args) {
        SpringApplication.run(Aggregation.class, args);
    }
}
@RestController
public class UserController {

    @Autowired
    private ElvisConfig elvisConfig;

    @GetMapping("hello")
    public ResultView hello() {
        return ResultView.builder().data(elvisConfig.getName() + elvisConfig.getWish()).build();
    }
}

参数间引用

application.properties中的各个参数之间也可以直接引用来使用,就像下面的设置:

com.elvis.name="懒癌正患者"
com.elvie.wish="希望世界和平"
com.elvis.says=${com.elvis.name}说${com.elvie.wish}

使用自定义配置文件

有时候我们不希望把所有配置都放在application.properties里面,这时候我们可以另外定义一个,这里我明取名为test.properties,路径跟也放在src/main/resources下面。

test.properties 的内容

com.elvis.name="懒癌正患者"
com.elvie.wish="希望世界和平"

我们新建一个bean类,如下:

@Data
@Configuration
@ConfigurationProperties(prefix = "com.elvis") 
@PropertySource("classpath:test.properties")
public class ConfigTestBean {
    
    private String name;
    
    private String wish;
}

这里要注意哦,有一个问题,如果你使用的是1.5以前的版本,那么可以通过locations指定properties文件的位置,这样:

@ConfigurationProperties(prefix = "com.elvis",locations="classpath:test.properties")

但是1.5版本后就没有这个属性了,找了半天发现添加@Configuration@PropertySource(“classpath:test.properties”)后才可以读取。

配置文件的优先级

application.propertiesapplication.yml文件可以放在以下四个位置:

  • 外置,在相对于应用程序运行目录的/congfig子目录里。
  • 外置,在应用程序运行的目录里
  • 内置,在config包内
  • 内置,在Classpath根目录

同样,这个列表按照优先级排序,也就是说,src/main/resources/config下application.properties覆盖src/main/resources下application.properties中相同的属性,此外,如果你在相同优先级位置同时有application.properties和application.yml,那么application.properties里的属性里面的属性就会覆盖application.yml。

Profile-多环境配置

当应用程序需要部署到不同运行环境时,一些配置细节通常会有所不同,最简单的比如日志,生产日志会将日志级别设置为WARN或更高级别,并将日志写入日志文件,而开发的时候需要日志级别为DEBUG,日志输出到控制台即可。
如果按照以前的做法,就是每次发布的时候替换掉配置文件,这样太麻烦了,Spring Boot的Profile就给我们提供了解决方案,命令带上参数就搞定。

这里我们来模拟一下,只是简单的修改端口来测试

在Spring Boot中多环境配置文件名需要满足application-{profile}.properties的格式,其中{profile}对应你的环境标识,比如:

  • application-dev.properties:开发环境
  • application-prod.properties:生产环境

想要使用对应的环境,只需要在application.properties中使用spring.profiles.active属性来设置,值对应上面提到的{profile},这里就是指dev、prod这2个。

当然你也可以用命令行启动的时候带上参数:

java -jar xxx.jar --spring.profiles.active=dev

我给不同的环境添加不同的端口属性server.port,然后根据指定不同的spring.profiles.active来切换使用。各位可以自己试试。这里就不贴代码了。

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

推荐阅读更多精彩内容