开发实用篇
本文根据黑马最新springboot而写
热部署
手动启动热部署
1.开启热部署
手动启动热部署
<!--手动启动热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
2.build project
关于热部署
热部署只有restart这个过程,而没有reload这个过程
自动热部署
第二步:
热部署范围
范围
手动设置排除项
手动配置哪些不需要热部署
devtools:
restart:
exclude: static/**,public/**,config/application.yml
@ConfigurationProperties来做Bean的属性绑定
- 回顾之前yml文件的读取
-
@Value()
-
Environment对象封装全部信息
-
使用@ConfigurationProperties的prefix使用自定义对象封装指定数据
注意封装类需要定义为spring管理的bean
-
自己开发的组件绑定属性
写一个类,让其属性使用配置文件读取
- 类
@Component
@Data
@ConfigurationProperties(prefix = "servers")
public class ipConfig {
private String ipAddress;
private int port;
private long timeOut;
}
prefix 写属性文件中对应属性的上一级名称。
- 属性文件
servers:
ipAddress: 192.168.0.1
port: 2345
timeOut: -1
- 测试
@SpringBootApplication
public class Springboot312ConfigurationApplication {
public static void main(String[] args) {
ConfigurableApplicationContext ctx = SpringApplication.run(Springboot312ConfigurationApplication.class, args);
ipConfig bean = ctx.getBean(ipConfig.class);
System.out.println(bean);
}
}
第三方bean绑定属性
上面的bean是自定义的,如果说yml文件想要使用第三方bean加载怎么办呢?
比如说Druid,想要使用yml读取配置信息
还在启动类中写下如下代码来模拟第三方bean
@Bean
@ConfigurationProperties(prefix = "datasource")
public DruidDataSource dataSource(){
DruidDataSource ds = new DruidDataSource();
return ds;
}
测试:
DruidDataSource da = ctx.getBean(DruidDataSource.class);
System.out.println(da.getDriverClassName());
@EnableConfigurationProperties
在启动类写==@EnableConfigurationProperties==({…写想要配置@ConfigurationProperties的类名.class…}),会自动将这个class定义为bean(相当于在对应类上使用==@Componet==),所以对应的类无需写@Componet这个注解了。
宽松绑定
使用@ConfigurationProperties要求yml实际上是可以写的比较随便的,比如我上面写的是driver-class-name.程序写的是driverClassName,这是因为格式要求比较宽松。有下面这些:
甚至于 _、-、大小写 随便加都行。主流格式是使用中划线(烤肉串模式)、或者驼峰、或者常量
注意
数据问题
时间/容量 单位问题
long本身描述时间的单位是毫秒,JDK8之后出的一个描述时间的类型Duration,基本单位也是毫秒
可以使用springboot的@DurationUnit注解来规定这个单位
同时还有一个注解@DataSizeUnit规定数据大小的单位
当然也可以不用注解,直接写单位的方式配置
bean数据格式校验
- 加validation校验依赖(JSR303规范)
这个本质上是一组接口
<!-- https://mvnrepository.com/artifact/jakarta.validation/jakarta.validation-api -->
<!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
运行报错,因为规范没实现,引入herbernate的校验器
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.4.1.Final</version>
</dependency>
-
开启校验==@Validated==
-
定义具体校验规则(Max…等注解)
Bean的作用域问题
默认使用web容器管理的bean是单例的,如果想要非单例,需要使用注解@Scop(“prototype”),这样的话。每次getbean都实例化一个。
关于通过容器管理的优势问题,比如说AlphaDao之前的项目有mybatis实现(使用了@Repository),后来有了新的xxx方案实现比较好(使用了@Repository),但是通过getBean分不清怎么办,在想用的实现类上加上@Primary即可。