源码地址: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、多数据源配置
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在线接口插件
参考文章:推荐一款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
我在微信订阅号等你!