SprngBoot学习笔记
SprngBoot开发实用篇——学习笔记
前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、热部署
1.1 手工启动热部署
(1)启动热部署
①:在Pom.xml文件中导入开发者工具对应的坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
②:构建项目,可以使用快捷键激活此功能
对应的快捷键: Ctrl + F9
(2)关于热部署
- 重启(Restart):自定义开发代码,包含类、页面、配置文件等,加载位置restart类加载器
- 重载(ReLoad):jar包,加载位置base类加载器
(3)小结
小结
1.开启开发者工具后启用热部署
2.使用构建项目操作启动热部署(Ctrl+F9)
3.热部署仅仅加载当前开发者自定义开发的资源,不加载jar资源
(4)痛点
1.2 自动启动热部署
(1)旧版(2021.2前的版本)
①:设置自动构建项目
打开【File】,选择【settings…】,在面板左侧的菜单中找到【Compile】选项,然后勾选【Build project automatically】,自动构建项目
②:允许在程序运行时进行自动构建
使用快捷键【Ctrl】+【Alt】+【Shit】+【/】打开维护面板,选择第1项【Registry…】
在选项中搜索compile,然后勾选对应项即可(新版本的IDEA已经去除这个选项)
(2)新版(2021.2后的版本)
注:新版本的IDEA,打开【File】,选择【settings…】,在面板左侧的菜单中找到【Advanced Settings】选项,然后勾选【Allow atuo-make to…】
激活方式:Idea失去焦点5秒后启动热部署
(3)小结
- 设置自动构建用于自动热部署
1.3 热部署范围配置
(1)配置中默认不参与热部署的目录信息如下
- /META-INF/maven
- /META-INF/resources
- /resources
- /static
- /public
- /templates
(2)自定义不参与重启排除项
spring:
devtools:
restart:
# 设置不参与热部署的文件或文件夹
exclude: static/**,public/**,config/application.yml
(3)小结
- 自定义重启排除项
1.4 关闭热部署功能
(1)属性加载优先顺序
②:禁用热部署
spring:
devtools:
restart:
enabled: false
③:如果当心配置文件层级过多导致相符覆盖最终引起配置失效,可以提高配置的层级,在更高层级中配置关闭热部署。例如在启动容器前通过系统属性设置关闭热部署功能。
@SpringBootApplication
public class Springboot12Application {
public static void main(String[] args) {
//禁用热部署
System.setProperty("spring.devtools.restart.enable","false");
SpringApplication.run(Springboot12Application.class);
}
}
二、配置高级
2.1 第三方bean属性绑定(@ConfigurationProperties注解)
(1)
①:@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);
}
}
(2)使用@ConfigurationProperties为第三方bean绑定属性
①:使用@Bean注解定义第三方bean
@Bean
public DruidDataSource datasource(){
DruidDataSource ds = new DruidDataSource();
//ds.setDriverClassName("com.mysql.jdbc.cj.Driver");
return ds;
}
}
②:在yml中定义要绑定的属性,注意datasource此时全小写
datasource:
driverClassName: com.mysql.jdbc.Driver
③:使用@ConfigurationProperties注解为第三方bean进行属性绑定,注意前缀是全小写的datasource
@Bean
@ConfigurationProperties(prefix = "datasource")
public DruidDataSource datasource(){
DruidDataSource ds = new DruidDataSource();
//ds.setDriverClassName("com.mysql.jdbc.cj.Driver");
return ds;
}
④:测试:
@SpringBootApplication
public class Springboot13ConfigurationApplication {
@Bean
@ConfigurationProperties(prefix = "datasource")
public DruidDataSource datasource() {
DruidDataSource ds = new DruidDataSource();
//ds.setDriverClassName("com.mysql.jdbc.cj.Driver");
return ds;
}
public static void main(String[] args) {
//获取容器对象
ConfigurableApplicationContext run = SpringApplication.run(Springboot13ConfigurationApplication.class, args);
ServerConfig bean = run.getBean(ServerConfig.class);
System.out.println(bean);
DruidDataSource druidDataSource = run.getBean(DruidDataSource.class);
System.out.println(druidDataSource.getDriverClassName());
}
}
(3)@EnableConfigurationProperties
作用: 标注使用@ConfigurationProperties注解绑定属性的bean是哪些
①:在配置类上开启@EnableConfigurationProperties注解,并标注要使用@ConfigurationProperties注解绑定属性的类
@SpringBootApplication
@EnableConfigurationProperties(ServerConfig.class)
public class Springboot13ConfigurationApplication {
}
②:在对应的类上直接使用@ConfigurationProperties进行属性绑定
@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {
private String ipAddress;
private int port;
private long timeout;
}
当使用@EnableConfigurationProperties注解时,spring会默认将其标注的类定义为bean,因此无需再次声明@Component注解了
注意:
@EnableConfigurationProperties与@Component不能同时使用
(4)解除使用@ConfigurationProperties注释警告
出现这个提示后只需要添加一个坐标此提醒就消失了
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
(5)小结
- 使用@ConfigurationProperties可以为使用@Bean声明的第三方bean绑定属性
- 当使用@EnableConfigurationProperties声明进行属性绑定的bean后,无需使用@Component注解再次进行bean声明
2.1 松散绑定
(1)即配置文件中的命名格式与变量名的命名格式可以进行格式上的最大化兼容
(2)@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 # 常量模式
(3)注意:宽松绑定不支持注解@Value引用单个属性的方式
@Bean
@ConfigurationProperties(prefix = "data-source")
public DruidDataSource datasource() {
DruidDataSource ds = new DruidDataSource();
return ds;
}
(4)@Value和@ConfigurationProperties比较
项目 | @ConfigurationProperties | @Value |
---|---|---|
功能 | 批量注入配置文件中的属性 | 分别指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR-303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
无论配置文件是 yml 还是 properties 他们都能获取到值。
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用 @Value。
如果说,我们专门编写了一个 JavaBean 来和配置文件进行映射,我们就直接使用@ConfigurationProperties。
(5)小结:
①:@ConfigurationProperties绑定属性支持属性名宽松绑定
②:@Value注解不支持松散绑定
③:绑定前缀命名命名规则
④:绑定前缀名推荐采用烤肉串命名规则,即使用中划线做分隔符