Spring Boot 应用本身的属性值(比如每页记录数),一般做成自定义的应用属性,放置在 application.yml 中。
(1)配置自定义属性
在 application.yml 中,自定义一个名为 pageSize 的属性,用于存放 整个应用的 “每页记录数” 参数。
app:
data:
pageSize: 30
上面的这些配置都是自定义的,而且支持任意嵌套。
(2)控制器层
配置好自定义属性之后,就可以直接在业务的控制器层 Controller 使用这些属性。
@ConfigurationProperties(prefix = "app.data")
public class OrderController {
private int pageSize = 20;
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
@GetMapping("/orders")
public String orders(@AuthenticationPrincipal User user, Model model) {
Pageable pageable= PageRequest.of(0,pageSize);
...
return "orders";
}
...
}
首先为 Controller 类添加 @ConfigurationProperties 注解。该注解的 prefix 属性设置为自定义属性的前缀,这样 Spring Boot 在获取 pageSize 属性时,就会自动加上该前缀,从而得到我们想要的自定义属性值。
设置断点后,请求该 URL 地址,就会发现 pageSize 的值是我们之前在 application.yml 中所定义的值:

(3)自定义属性类
更好的一种方式是自定义一个应用属性类,专门用来持有整个应用的自定义属性。这样做的好处是:
- 避免自定义属性代码与应用控制器代码杂糅在一起,不好维护;
- 不同的应用控制器,可以共享应用属性类中的通用参数。
首先定义一个公共的应用属性类,内部包含需要的公共属性(比如 pageSize):
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 应用通用属性
*
* @author Deniro Lee
*/
@Component
@ConfigurationProperties(prefix = "app.data")
@Data
public class AppProps {
private int pageSize = 20;
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
}
然后在应用的 Controller 类中载入 AppProps 属性类:
private AppProps appProps;
public OrderController(AppProps appProps) {
this.appProps = appProps;
}
@GetMapping("/orders")
public String orders(@AuthenticationPrincipal User user, Model model) {
Pageable pageable= PageRequest.of(0,appProps.getPageSize());
...
return "orders";
}
运行结果:

通过断点可以看到,在请求时, appProps 的 getPageSize() 方法会返回我们之前在配置文件中所定义的值。
网友评论