一、springBoot的配置文件讀取
在項目中我們可能會把業務相關的配置會放在配置文件中,在springBoot中我們可以通過以下幾種方式讀取配置信息
1. Environment:可以通過 Environment 的 getProperty 方法老獲取想要的配置信息,代碼如下:
@Service
public class BasicServiceImpl implements BasicInfoService {
private final Environment environment;
@Autowired
public BasicServiceImpl(Environment environment) {
this.environment = environment;
}
@Override
public String getBasicInfoByEnv() {
return environment.getProperty("server.port");
}
}
server.port:爲下圖中配置文件中的信息
2. @Value:可以注入具體的的配置信息,注入的代碼如下
@Component
public class BasicInfo {
@Value("${spring.application.name}")
private String applicationName;
@Value("${server.port}")
private String applicationPort;
public String getApplicationName() {
return applicationName;
}
public void setApplicationName(String applicationName) {
this.applicationName = applicationName;
}
public String getApplicationPort() {
return applicationPort;
}
public void setApplicationPort(String applicationPort) {
this.applicationPort = applicationPort;
}
}
使用的代碼如下:
@Service
public class BasicServiceImpl implements BasicInfoService {
private final BasicInfo basicInfo;
@Autowired
public BasicServiceImpl(BasicInfo basicInfo) {
this.basicInfo = basicInfo;
}
@Override
public String getBasicInfoByConfig() {
return basicInfo.getApplicationName();
}
}
通過以上兩種配置中的任意一種配置都可以實現對配置文件的讀取。
二、actuator監控
它是Spring Boot 提供的一個用於監控和管理自身的應用信息的模塊,使用時只需要加一個依賴就可以,依賴如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
添加這個依賴後,我們啓動應用然後訪問 /actuator/health 這個鏈接,就可以看到下面的信息:
up 代表當前應用處於健康的狀態,如果是DOWN就表示當前的應用不健康。
通過下面的配置可以一些健康信息的詳情也顯示出來,配置如下:
#顯示詳細的將康信息
management.endpoint.health.show-details=always
添加後啓動應用再次訪問 /actuator/health 這個鏈接,就可以看到下面的信息:
{
"status":"UP",
"components":{
"diskSpace":{
"status":"UP",
"details":{
"total":105732108288,
"free":99814854656,
"threshold":10485760,
"exists":true
}
},
"ping":{
"status":"UP"
}
}
}
大部分端點不會暴露出來,我們可以手動配置需要暴露的端點,如果需要暴露多個端點,可以用逗號分隔,如果想要全部端點都暴露出來可以用 * 來表示,配置如下:
management.endpoints.web.exposure.include=*
如果我們需要對應用的將康狀態增加一些其他維度的數據,可以通過下面的方式實現:
@Component
public class UserHealthIndicator extends AbstractHealthIndicator {
@Override
protected void doHealthCheck(Health.Builder builder) throws Exception {
builder.up().withDetail("status",true);
}
}
添加上述代碼後,可以重啓應用,再次訪問 /actuator/health 這個鏈接,就可以看到下面的信息:
{
"status":"UP",
"components":{
"diskSpace":{
"status":"UP",
"details":{
"total":105732108288,
"free":99814850560,
"threshold":10485760,
"exists":true
}
},
"ping":{
"status":"UP"
},
"user":{
"status":"UP",
"details":{
"status":true
}
}
}
}
其中上面的 user 部分就是我們自定義的部分。
加入我們想查看當前登錄的用戶信息,我們可以用自定義全新的端點實現,通過@EndPoint 就可以實現,代碼如下:
@Component
@Endpoint(id="user")
public class UserEndPoint {
@ReadOperation
public List<Map<String,Object>> health(){
List<Map<String,Object>> list = new ArrayList<>();
Map<String,Object> map = new HashMap<>();
map.put("userId",1001);
map.put("userName","admin");
list.add(map);
return list;
}
}
添加上述代碼後,可以重啓應用,再次訪問 /actuator/user 這個鏈接,就可以看到下面的信息:
[
{
"userName":"admin",
"userId":1001
}
]
三、統一異常處理
有時候我們需要對一些異常要自定義返回的錯誤格式,我們可以通過下面的方式實現:
@ControllerAdvice
public class GlobalExceptionHandler {
private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(value = Exception.class)
@ResponseBody
public ResponseData defaultErrorHandler(HttpServletRequest req,Exception e)throws Exception{
logger.error("統一異常處理--------------",e);
ResponseData responseData = new ResponseData();
responseData.setMessage(e.getMessage());
if(e instanceof NoHandlerFoundException){
responseData.setCode(404);
}else {
responseData.setCode(500);
}
responseData.setData(null);
responseData.setStatus(false);
return responseData;
}
}
public class ResponseData {
private Boolean status;
private int code;
private String message;
private Object data;
public Boolean getStatus() {
return status;
}
public void setStatus(Boolean status) {
this.status = status;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
上面的代碼添加後還要在配置文件中加下面的配置:
#出現錯誤時直接拋出異常
spring.mvc.throw-exception-if-no-handler-found=true
#不要爲我們的工程中的資源文件建立映射
spring.resources.add-mappings=false
這樣就完成了一個簡單的統一異常處理,當我們訪問一個不存在的接口會出現下面的情況
我們看到上面的返回信息就是我們自定義的返回信息。