spring项目

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");

11.springboot配置kafka

Apache Kafka与Spring整合应用详解_spring for apache kafka-优快云博客文章浏览阅读993次,点赞10次,收藏6次。本文详细介绍了如何使用Spring Kafka整合Apache Kafka,包括项目依赖配置、Kafka配置、生产者与消费者的实现以及简单的测试控制器。通过这些示例代码,新人可以快速上手,并且深入理解Spring与Kafka的集成方式。希望本文对你有所帮助,祝你在Java开发的路上越来越顺利!_spring for apache kafkahttps://blog.youkuaiyun.com/weixin_53840353/article/details/139789719

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值