SpringCloud框架初探(一):SpringBoot知識整理

源碼地址:SpringCloud學習源碼

講SpringCloud之前,肯定要先有SpringBoot的基礎知識,因爲SpringCloud是基於SpringBoot開發的。

1、springboot優點

1)、開箱即用,提供各種默認配置來管理項目,無需XML配置;
2)、內嵌式容器簡化Web項目,無需部署War文件;
3)、簡化Maven配置;
4)、獨立的Spring應用程序;
5)、自動配合Spring;

2、springboot常用註解

(1)@Controller與@RestController
@Controller類中的方法可以直接通過返回String跳轉到jsp、ftl、html等模版頁面。在方法上加@ResponseBody註解,也可以返回實體對象。
@RestController類中的所有方法只能返回String、Object、Json等實體對象,不能跳轉到模版頁面。
@RestController相當於@ResponseBody + @Controller。

@RestController
@RequestMapping("/users")
public class TestUserController {

   @RequestMapping(value = "/queryUserList", method = RequestMethod.GET)
	public BaseJSON queryUserList(String token,String username) {
          	……
	}

}


@Controller
@RequestMapping("/users")
public class TestUserController {
    @RequestMapping(value = "/queryUserList", method = RequestMethod.GET)
	@ResponseBody
	public BaseJSON queryUserList(String token,String username) {
          	……
	}

}
   

(2)@SpringBootApplication

之前用戶使用的是3個註解註解他們的main類。分別是@Configuration,@EnableAutoConfiguration,@ComponentScan。由於這些註解一般都是一起使用,spring boot提供了一個統一的註解@SpringBootApplication。

(3)@Configuration 與 @ConfigurationProperties
在Spring中可以使用一個java類,@Configuration,@Bean這兩個註解代替xml配置,@Configuration 相當於xml中的標籤 @Bean相當於標籤

@ConfigurationProperties讀取springboot配置文件

@Bean(name = "master1DataSource")
	@ConfigurationProperties(prefix = "master1.datasource")
	@Primary
	public DataSource master1DataSource() {
		return DataSourceBuilder.create().build();
	}

在這裏插入圖片描述

(4)@EnableSwagger2
啓用swagger在線接口文檔。

3、多數據源配置

參考文章:springboot多數據源配置以及事務控制

4、多數據源事務控制

參考文章:springboot多數據源配置以及事務控制

5、對象參數,屬性非空校驗

在接口對象參數前,加上註解@Valid @ApiParam
實體字段上面,加上@NotNull(message = “XXX不能爲空”)

	/**
	 * BindingResult必須緊跟@Valid參數
	 * @param book
	 * @param bindingResult
	 * @param token
	 * @return
	 */
	@ApiOperation("測試參數必填")
	@ApiImplicitParams({
		@ApiImplicitParam(paramType = "query", name = "token", dataType = "String", required = true, value = "token", defaultValue = "27f89c585360448f2cd201c35285a872")
	})
	@RequestMapping(value = "/saveBook", method = RequestMethod.POST)
	public BaseJSON saveUser(@Valid @ApiParam @RequestBody Book book,BindingResult bindingResult,String token) {
		BaseJSON json = new BaseJSON();
		
		//驗證接口令牌
		if(!TokenValidateUtil.Validate(token, json)){
			return json;
		}
		
		if (bindingResult.hasErrors()) {
			json.setCode(-1);
			json.setMsg(bindingResult.getFieldError().getDefaultMessage());
			return json;
		}

		return json;
	}
@ApiModel(value="圖書對象")
public class Book {
	@ApiModelProperty(value="用戶ID")
	private String id;
	
	@NotNull(message = "isbn編號不能爲空")
	@ApiModelProperty(value="isbn編號")
	private String isbn;
	
	@NotNull(message = "圖書名稱不能爲空")
	@ApiModelProperty(value="圖書名稱")
	private String name;
   ……
}

6、swagger在線接口插件

參考文章:推薦一款API神器Swagger

7、統一異常處理

@ControllerAdvice controller的一個輔助類,最常用的就是作爲全局異常處理的切面類,可以指定掃描範圍,約定了幾種可行的返回值,如果是直接返回model類的話,需要使用@ResponseBody進行json轉換返回String,表示跳到某個view.

@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
	
	 /**
	  * 統一異常處理
     * @param request
     * @param exception
     * @return
     * @throws Exception
     */
    @ExceptionHandler(value=Exception.class)  
    public BaseJSON allExceptionHandler(HttpServletRequest request,  
            Exception e) throws Exception  
    {  
        e.printStackTrace();
        BaseJSON json = new BaseJSON();
        json.setCode(CommonErrorCode.SYSTEM_EXCEPTION_CODE);
        json.setMsg(CommonErrorCode.SYSTEM_EXCEPTION_CODE_MSG);
        return json;
    }  


}

8、AOP切面日誌

import java.util.Arrays;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

@Aspect
@Component
public class WebLogAspect {

    private Logger logger = Logger.getLogger(getClass());
    ThreadLocal<Long> startTime = new ThreadLocal<>();
    
    @Pointcut("execution(public * com.gwm.controller..*.*(..))")
    public void webLog(){}

    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint) throws Throwable {
        // 接收到請求,記錄請求內容
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        startTime.set(System.currentTimeMillis());
        // 記錄下請求內容
        logger.info("URL : " + request.getRequestURL().toString());
        logger.info("HTTP_METHOD : " + request.getMethod());
        logger.info("IP : " + request.getRemoteAddr());
        logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
        logger.info("ARGS : " + Arrays.toString(joinPoint.getArgs()));
        logger.info("SPEND TIME : " + (System.currentTimeMillis() - startTime.get()));
    }

    @AfterReturning(returning = "ret", pointcut = "webLog()")
    public void doAfterReturning(Object ret) throws Throwable {
        // 處理完請求,返回內容
        logger.info("RESPONSE : " + ret);
    }
}
2018-09-26 16:36:36.549  INFO 1200 --- [nio-8090-exec-2] o.a.c.c.C.[.[.[/spring-boot-sso-dealer]  : Initializing Spring FrameworkServlet 'dispatcherServlet'
2018-09-26 16:36:36.549  INFO 1200 --- [nio-8090-exec-2] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization started
2018-09-26 16:36:36.606  INFO 1200 --- [nio-8090-exec-2] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 57 ms
2018-09-26 16:36:41.676  INFO 1200 --- [nio-8090-exec-6] com.gwm.aop.WebLogAspect                 : URL : http://localhost:8090/spring-boot-sso-dealer/taskManager/findListTask
2018-09-26 16:36:41.676  INFO 1200 --- [nio-8090-exec-6] com.gwm.aop.WebLogAspect                 : HTTP_METHOD : POST
2018-09-26 16:36:41.676  INFO 1200 --- [nio-8090-exec-6] com.gwm.aop.WebLogAspect                 : IP : 0:0:0:0:0:0:0:1
2018-09-26 16:36:41.676  INFO 1200 --- [nio-8090-exec-6] com.gwm.aop.WebLogAspect                 : CLASS_METHOD : com.gwm.controller.TaskController.findListTask
2018-09-26 16:36:41.676  INFO 1200 --- [nio-8090-exec-6] com.gwm.aop.WebLogAspect                 : ARGS : [27f89c585360448f2cd201c35285a872, 120110, 2041, 1]
2018-09-26 16:36:41.676  INFO 1200 --- [nio-8090-exec-6] com.gwm.aop.WebLogAspect                 : SPEND TIME : 1
2018-09-26 16:36:42.620  INFO 1200 --- [nio-8090-exec-6] com.gwm.aop.WebLogAspect                 : RESPONSE : com.gwm.domain.json.BaseJSON@c3f33f

我在微信訂閱號等你!
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章