天天看点

开发实用篇(一)热部署配置高级

热部署

手工启动热部署

启动热部署

步骤①:导入开发者工具对应的坐标

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

步骤②:构建项目,可以使用快捷键激活此功能

开发实用篇(一)热部署配置高级
关于热部署
  • 重启(Restart):自定义开发代码,包含类、页面、配置文件等,加载位置restart类加载器
  • 重载(ReLoad):jar包,加载位置base类加载器
  • 热部署仅仅执行

    Restart

    操作
小结
  1. 开启开发者工具后启用热部署
  2. 使用构建项目操作启动热部署
  3. 热部署仅仅加载当前开发者自定义开发的资源,不加载 jar 资源

自动启动热部署

步骤①:设置自动构建项目

开发实用篇(一)热部署配置高级

步骤②:允许在程序运行时进行自动构建

开发实用篇(一)热部署配置高级
  • 这样程序在运行的时候就可以进行自动构建了,实现了热部署的效果。
  • 激活方式:IDEA 失去焦点5秒后启动热部署

热部署范围配置

配置中默认不参与热部署的目录信息如下
  • /META-INF/maven

  • /META-INF/resources

  • /resources

  • /static

  • /public

  • /templates

自定义不参与重启排除项
spring:
  devtools:
    restart:
      # 设置不参与热部署的文件或文件夹
      exclude: static/**,public/**,config/application.yml
           

关闭热部署

属性加载优先顺序
  • 参看 https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config
开发实用篇(一)热部署配置高级
禁用热部署
  • 配置文件中
devtools:
    restart:
      # 设置不参与热部署的文件或文件夹
      exclude: static/**,public/**,config/application.yml
			# 禁用热部署
      enabled: false
           
  • 如果当心配置文件层级过多导致相互覆盖最终引起配置失效,可以提高配置的层级
  • 在更高层级中配置关闭热部署。
  • 例如在启动容器前通过系统属性设置关闭热部署功能。
@SpringBootApplication
public class Springboot12HotDeployApplication {

    public static void main(String[] args) {
        // 禁用热部署
        System.setProperty("spring.devtools.restart.enabled", "false");
        SpringApplication.run(Springboot12HotDeployApplication.class, args);
    }

}
           

配置高级

@ConfigurationProperties

  • 在基础篇学习了

    @ConfigurationProperties

    注解,此注解的作用是用来为 bean 绑定属性的。开发者可以在yml配置文件中以对象的格式添加若干属性
servers:
  ip-address: 192.168.0.1 
  port: 2345
  timeout: -1
           
  • 然后再创建一个用来封装数据的实体类,注意要提供属性对应的

    setter

    方法
@Component
@Data
public class ServerConfig {

    private String ipAddress;
    private int port;
    private long timeout;

}
           
  • 使用

    @ConfigurationProperties

    注解就可以将配置中的属性值关联到开发的模型类上
@Component
@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {

    private String ipAddress;
    private int port;
    private long timeout;

}
           
  • 在启动类中测试
@SpringBootApplication
public class Springboot13ConfigurationApplication {

    public static void main(String[] args) {
        // 获取容器对象
        ConfigurableApplicationContext run = SpringApplication.run(Springboot13ConfigurationApplication.class, args);
        ServerConfig bean = run.getBean(ServerConfig.class);
        System.out.println(bean);

    }
}
           
我们还可以使用

@ConfigurationProperties

为第三方bean绑定属性

步骤①:使用 @Bean 注解定义第三方bean

@Bean
public DruidDataSource datasource(){
    DruidDataSource ds = new DruidDataSource();
    return ds;
}
           

步骤②:在yml中定义要绑定的属性,注意

datasource

此时全小写

dataSource:
  driverClassName: com.mysql.jdbc.Driver
           

步骤③:使用

@ConfigurationProperties

注解为第三方 bean 进行属性绑定,注意前缀是全小写的

datasource

@Bean
@ConfigurationProperties(prefix = "datasource")
public DruidDataSource datasource(){
    DruidDataSource ds = new DruidDataSource();
    return ds;
}
           
  • 在启动类中测试
@SpringBootApplication
public class Springboot13ConfigurationApplication {

    @Bean
    @ConfigurationProperties(prefix = "datasource")
    public DruidDataSource dataSource() {
        DruidDataSource ds = new DruidDataSource();
        return ds;
    }

    public static void main(String[] args) {
				// 获取容器对象
        ConfigurableApplicationContext ctx = SpringApplication.run(Springboot13ConfigurationApplication.class, args);
        ServerConfig bean = ctx.getBean(ServerConfig.class);
        System.out.println(bean);

        DruidDataSource ds = ctx.getBean(DruidDataSource.class);
        System.out.println(ds.getDriverClassName());
    }

}
           
关于

@EnableConfigurationProperties

注解
  • 作用:标注使用

    @ConfigurationProperties

    注解绑定属性的类有哪些

步骤①:在启动类上开启

@EnableConfigurationProperties

注解,并标注要使用

@ConfigurationProperties

注解绑定属性的类

@SpringBootApplication
@EnableConfigurationProperties({ServerConfig.class})
public class Springboot13ConfigurationApplication {
}
           

步骤②:在对应的类上直接使用

@ConfigurationProperties

进行属性绑定

//@Component 此时无需使用这个注解
@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {

    private String ipAddress;
    private int port;
    private long timeout;

}
           
注意:
  • 当使用

    @EnableConfigurationProperties

    注解时,spring 会默认将其标注的类定义为bean,因此无需再次声明

    @Component

    注解了
  • @EnableConfigurationProperties

    @Component

    不能同时使用
解除使用

@ConfigurationProperties

注释警告
开发实用篇(一)热部署配置高级

如果出现这个提示,只需要添加一个坐标后此提醒就消失了

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
           
小结
  1. 使用@ConfigurationProperties可以为使用@Bean声明的第三方bean绑定属性
  2. 当使用@EnableConfigurationProperties声明进行属性绑定的bean后,无需使用@Component注解再次进行bean声明

宽松绑定/松散绑定

宽松绑定:即配置文件中的命名格式与变量名的命名格式可以进行格式上的最大化兼容

@ConfigurationProperties

绑定属性支持属性名宽松绑定
开发实用篇(一)热部署配置高级
servers:
#  ipAddress: 192.168.0.1       # 驼峰模式
#  ip_address: 192.168.0.2      # 下划线模式
  ip-address: 192.168.0.3      # 烤肉串模式(推荐)
#  IP_ADDRESS: 192.168.0.4      # 常量模式
           
宽松绑定不支持注解

@Value

引用单个属性的方式
@SpringBootTest
class Springboot13ConfigurationApplicationTests {

    @Value("${servers.ipAddress}") // 这里不支持宽松绑定
    private String msg;

    @Test
    void contextLoads() {
        System.out.println(msg);
    }

}
           
绑定前缀名命名规范:仅能使用纯小写字母、数字、中划线作为合法的字符
开发实用篇(一)热部署配置高级
@Bean
    @ConfigurationProperties(prefix = "data-source")
    public DruidDataSource datasource() {
        DruidDataSource ds = new DruidDataSource();
        return ds;
    }
           

@Value

@ConfigurationProperties

比较
  • 无论配置文件是

    yml

    还是

    properties

    他们都能获取到值。
  • 如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用

    @Value

  • 如果说,我们专门编写了一个 JavaBean 来和配置文件进行映射,我们就直接使用

    @ConfigurationProperties

小结
  1. @ConfigurationProperties 绑定属性支持属性名宽松绑定
  2. @Value注解不支持松散绑定
  3. 绑定前缀命名命名规则
  4. 绑定前缀名推荐采用烤肉串命名规则,即使用中划线做分隔符

常用计量单位绑定

SpringBoot 支持JDK8提供的时间与空间计量单位
//@Component
@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {

    private String ipAddress;
    private int port;
    private long timeout;
    
    // 时间计量单位
    @DurationUnit(ChronoUnit.HOURS)
    private Duration serverTimeOut;
    
    // 空间计量单位
    @DataSizeUnit(DataUnit.MEGABYTES)
    private DataSize dataSize;

}
           
  • Duration:表示时间间隔,可以通过

    @DurationUnit

    注解描述时间单位,例如上例中描述的单位分钟(ChronoUnit.MINUTES)
  • DataSize:表示存储空间,可以通过

    @DataSizeUnit

    注解描述存储空间单位,例如上例中描述的单位为MB(DataUnit.MEGABYTES)

数据校验

  • 开启数据校验有助于系统安全性,J2EE规范中JSR303规范定义了一组有关数据校验相关的API
开启Bean数据校验

步骤①:开启校验框架

<!--1.导入JSR303规范-->
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
</dependency>
<!--使用hibernate框架提供的校验器做实现-->
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
</dependency>
           

步骤②:在需要开启校验功能的类上使用

@Validated

注解开启校验功能

//@Component
@Data
@ConfigurationProperties(prefix = "servers")
// 2.开启对当前bean的属性注入校验
@Validated
public class ServerConfig {
}
           

步骤③:对具体的字段设置校验规则

//@Component
@Data
@ConfigurationProperties(prefix = "servers")
// 2.开启对当前bean的属性注入校验
@Validated
public class ServerConfig {

    // 设置具体的校验规则
    @Max(value = 8888, message = "最大值不能超过8888")
    @Min(value = 202, message = "最小值不能低于202")
    private int port;
           
开发实用篇(一)热部署配置高级
小结
  1. 启用Bean属性校验
  • 导入JSR303与Hibernate校验框架坐标
  • 使用@Validated注解启用校验功能
  • 使用具体校验规则规范数据校验格式

进制数据转换规则

yaml 语法规则
# 字面值表示方式

boolean: TRUE       #TRUE,true,True,FALSE,false , False 均可
float: 3.14         #6.8523015e+5 # 支持科学计数法
int: 123            #0b1010_0111_0100_1010_1110 # 支持二进制、八进制、十六进制
# null: ~             # 使用 ~ 表示 null
string: HelloWorld  # 字符串可以直接书写
string2: "Hello World"  # 可以使用双引号包裹特殊字符
date: 2018-02-17        # 日期必须使用 yyyy-MM-dd 格式
datetime: 2018-02-17T15:02:31+08:00   # 时间和日期之间使用 T 连接,最后使用 + 代表时区
           
  • 注意在配制文件中 字符串的书写 加上引号包裹,养成习惯,遇到0开头的数据多注意。
小结
  1. 注意yaml文件中对于数字的定义支持进制书写格式,如需使用字符串请使用引号明确标注

继续阅读