美文网首页
Spring Boot 笔记

Spring Boot 笔记

作者: 懒癌正患者 | 来源:发表于2018-05-05 02:59 被阅读0次

新建 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来切换使用。各位可以自己试试。这里就不贴代码了。

相关文章

网友评论

      本文标题:Spring Boot 笔记

      本文链接:https://www.haomeiwen.com/subject/jifsrftx.html