1、开始
登录网站https://start.spring.io/,根据配置生成初始的项目结构
一般增加
springboot-web---用来开发web应用
springboot-validation---用来做参数校验
openfeign+eureka-client+eureka-server---一般搭配起来使用,主要是用来集群之前的请求调用
springboot-test---用来做测试
lombok---注释生成代码
2、pom文件补充依赖
springboot-mail---邮件相关
springboot-quartz---spring整合quartz定时任务
spring-restdocs-mockmvc---通过springtest来生成api文档,不推荐了 考虑下smart-doc
3、简单的启动服务
补充git代码地址
4、springboot-validation校验
entity+controller+异常处理,一般三者搭配使用
entity
package fast.boot.entity.vo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.*;
import java.util.List;
@Data //自动构造set(),get()方法
@NoArgsConstructor //自动构造无参数函数
@AllArgsConstructor //自动构造带参数的函数
@Builder//自动构造builer模式
public class UserVO {
@NotNull
private String id;
//message设置校验不通过的提示信息
@NotBlank(message = "用户名不能为空")
private String userName;
//正则校验-手机号校验
@Pattern(regexp="^((0[0-9]{2,3}-)?([2-9][0-9]{6,7})+(-[0-9]{1,4})?)$|^(0?1[3578][0-9]{9})$|^(400[0-9]{7})$") //正则校验
private String userPhone;
//数值校验
@Max(value = 60, message = "未成年或者退休人员")
@Min(value = 18, message = "未成年或者退休人员")
private long age;
@Size(max = 32, min = 3, message = "长度大于3小于32")
private String um;
//collection校验
@NotEmpty
private List<String> bankCard;
}
controller
@RequestMapping(method = RequestMethod.POST, value = "/user/info")
public UserVO getUserInfo(@RequestBody @Validated UserVO userVO1){
UserVO userVO = new UserVO();
userVO.setUserPhone("1111");
userVO.setUserName("joy");
return userVO;
}
异常处理
@ControllerAdvice(basePackages = "fast.boot.controller")
@Slf4j
@ResponseBody//这里需要使用ResponseBody注解来输出,这里需要注意controller层需要用RestController注解
public class FastBootExceptionHandler {
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public String methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e){
log.info(e.getMessage());
return "这里自己修改异常封装";
}
}
5.@Resource+application.properties,实现根据配置调用对应服务
controller层
@RestController
public class FastBootController {
@Resource(name = "${file.obs.service}")//这里通过配置获取servicebean
private FileObsService fileObsService;
@RequestMapping(method = RequestMethod.POST, value = "/user/info")
public void getUserInfo(@RequestBody @Validated UserVO userVO1){
fileObsService.uploadFile(null);
return;
}
}
配置文件
file.obs.service=awsFileObsServiceImpl
servicie1
@Service
@Slf4j
public class AwsFileObsServiceImpl implements FileObsService {
@Override
public void uploadFile(MultipartFile file) {
log.info("调用AWS去上传文件");
}
}
service2
@Service
@Slf4j
public class LocalFileObsServiceImpl implements FileObsService {
@Override
public void uploadFile(MultipartFile file) {
log.info("本地保存文件");
}
}
通过修改配置文件中的servicebean来切换调用不同的上传文件方法
6.@Resource注解+exclude_list+include_list,实现有选择的多任务调用
@Resource
private Map<String, FastBootCommonTask> tasks;
@RequestMapping(method = RequestMethod.POST, value = "/user/info")
public void getUserInfo(@RequestBody @Validated UserVO userVO1){
//需要执行的taskbean
List<String> executeTaskList= Lists.newArrayList("syncUserInfoTask");
tasks.keySet().stream().filter(key->executeTaskList.contains(key)).forEach(key->
tasks.get(key).execute(null));
}
public interface FastBootCommonTask {
//编写多个实现,以便调用
public void execute(Map<String, Object> params);
}
6.WebMvcConfigurer+HandlerInterceptor实现mvc拦截器
@Slf4j
public class FastBootInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("这是一个拦截器");
return HandlerInterceptor.super.preHandle(request, response, handler);
}
}
@Configuration
public class FastBootWebConfig implements WebMvcConfigurer {
/**
* 注册拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new FastBootInterceptor());//注册拦截器
//多个拦截器,按顺序去添加
}
}
7.@WebFilter+javax.servlet.annotation.WebFilter实现过滤器
/**
* 过滤器,一般用来对请求进行过滤
*/
@WebFilter("/*") //过滤器匹配的请求
@Slf4j
@Component
public class FastBootWebFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
log.info("过滤器1");
//TODO 增加过滤器的逻辑,一般都是token验证之类的
filterChain.doFilter(servletRequest, servletResponse);
}
}
8.@ControllerAdvice实现异常全局处理
@ControllerAdvice(basePackages = "fast.boot.controller")
@Slf4j
@ResponseBody//这里需要使用ResponseBody注解来输出,这里需要注意controller层需要用RestController注解
public class FastBootExceptionHandler {
/**
* 处理 spring-validation抛出的MethodArgumentNotValidException
* @param e
* @return
*/
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public String methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e){
log.info(e.getMessage());
return "aaaa";
}
/**
* 处理业务异常,这里一般会定义一个业务系统统一使用的异常如businessException,在对这个异常进行全局处理,封装返回
* @param e
* @return
*/
@ExceptionHandler(value = Exception.class)
public void commonExceptionHandler(Exception e){
//log.info(e.getMessage());
log.info("bbb");
//return "bbb";
}
}
9.利用javax.script在java中执行script脚本
public class FastBootScript {
private ScriptEngine engine;
public void init() throws ScriptException {
engine = new ScriptEngineManager().getEngineByName("js");
engine.eval("function say() {return 'fast boot!';}");
}
public String executeScript() throws ScriptException {
return (String) engine.eval("say();");
}
public static void main(String[] args) throws ScriptException {
FastBootScript f = new FastBootScript();
f.init();
String v = f.executeScript();
System.out.println(v);
}
}
带入参样例
public class FastBootScript {
private ScriptEngine engine;
public void init() throws ScriptException {
engine = new ScriptEngineManager().getEngineByName("js");
engine.eval("function say(x, y) {return (x + y);}");
}
public Object executeScript(int x, int y) throws ScriptException {
return engine.eval("say("+ x +", "+ y +");");
}
public static void main(String[] args) throws ScriptException {
FastBootScript f = new FastBootScript();
f.init();
Object v = f.executeScript(1 ,2);
System.out.println(v);
//转化为long
System.out.println(Math.round((double)v));
}
}
10.关闭注册中心eureka和nacos
在本地开发时,由于很多时候环境问题,我们并不需要连接到注册中心上,此时就需要去禁用客户端
eureka版本:在配置文件中设置 eureka.client.enabled=false
nacos版本:
spring.cloud.nacos.config.enabled=false spring.cloud.nacos.discovery.enabled=false spring.cloud.nacos.config.refresh-enabled=false spring.cloud.nacos.discovery.instance-enabled=false
nacos版本2:
在spring的启动类中设置
System.setProperty("spring.cloud.nacos.config.enabled", "false");
System.setProperty("spring.cloud.nacos.discovery.enabled", "false");