1. 程式人生 > >SpringCloud框架初探(一):SpringBoot知識整理

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

講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、多資料來源配置

4、多資料來源事務控制

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線上介面外掛

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 : [email protected]

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