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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013628152/article/details/82854402

源码地址: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多数据源配置以及事务控制

扫描二维码关注公众号,回复: 4137950 查看本文章

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

我在微信订阅号等你!
这里写图片描述

猜你喜欢

转载自blog.csdn.net/u013628152/article/details/82854402