Web开发SpringBoot SpringMVC Spring的学习笔记(包含开发常用工具类)

开发框架学习笔记

一.Spring SpringMVC SpringBoot

三者的联系

MVC是一种设计框架, 市面上也有很多其他的MVC web框架,但是SpringMVC是佼佼者

  • 总结: springboot是spring的升级, springMVC是一种MVC框架(MVC框架的作用看下图)

SpringMVC工作原理


这里我的理解是handler可能是前端发ajax请求的那段代码?还是说是后端各种controller类和其RequestMapping('URL')的一个集合?

  • 总结

相关参考文档如下:
MVC思想及SpringMVC设计理念
Spring MVC+ Spring + Mybatis "三大框架"介绍
SpringMVC---Handler到底是个什么?及流程详解

二.SpringBoot的学习

controller中的各个注解

autowired和resource

service的iml类的注解

dto和entity的注解

config中的注解

@Resource和@Autowired 在类中使用, 可以让spring帮忙管理Java对象

@Data:自动给我们创建的对象加上set get方法

@Component: 在类外标识, 可以让spring帮我们管理这个类(Bean)

@Sl4j 利用工具类可以进行一些日志的记录

框架学习

为什么这里可以直接用save呢,他怎么知道我查的哪个表?

这是因为继承了mybatisplus中的ServiceImpl类,并指定了当前类用到的mapper接口UserMapper和对应的entity实体类user

2.各个类之间的继承和实现关系

3.理解面向对象的思想(其实这个想写在2中的)

四.开发常用工具Lombok

4.0说在前面(如何快速使用Lombok)

  • 最简单的办法在maven中加入如下依赖
xml 复制代码
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
    <scope>provided</scope>
</dependency>
  • 老版本的idea需要安装Lombok插件(否则写代码的时候会报错),并且打开设置中的enable annotation processing (否则idea不识别Lombok的注解)但是新版本(21开始吧)idea已经自带Lombok插件了; 这里引出来一个问题:为什么要idea要装插件?

    因为idea本质上是一个可视化的编辑器, java编译器会根据Lombok的注解修改语法树,最终结果是被注解标记的java类生成的字节码文件中会包含Lombok生成的代码, 但是我们写代码的时候出于源码阶段还没编译呢, idea当然识别不出来Lombok的注解生成一些get set方法了

4.1了解Lombok

官网解释

Project Lombok is a java library that automatically plugs into your editor and build tools, spicing(香料,调味剂) up your java.

Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.

提取关键词:Java 库、自动插件、提高效率、再也不编写get、equals等方法、使用注解

4.2Lombok的作用一:减少代码冗余

使用Lombok前:即使idea提供了快捷键cmd + n手动快捷生成get/set/equals/hashCode/toString方法,但表多了后还是很麻烦

使用后效果:加注解,减少代码冗余

4.3Lombok的作用二:方便打日志

日志和传统打印操作相比的好处是日志是可插拔的, 日后上线的时候可以在配置文件中动态的开关,但是sout的内容需要手动去一个个文件中寻找并删除

  • 小技巧@Sl4j打日志的时候不仅仅可以直接打印,还可以用如下这种占位符的方法打印变量
java 复制代码
/**
     * 实现log4j的符号{}打印
     */
    @Test
    public void print2(){
 
        Person person1 = new Person("chen",123,"man");
        Person person2 = new Person("li",234,"women");
        System.out.println("=====================================================");
        //Person类用Lombok实现了toString()方法
        logger.info("This is a debug message,person1={},person2={}",person1,person2);
        System.out.println("=====================================================");
    }

4.4Lombok使用方法(各个注解作用)

  • @Data:生成该类的get/set/equals/hashCode/toString方法
  • @Sl4j:自动在该类中生成一个private Logger log = LoggerFactory.getLogger(this.getClass());即log对象, 我们可以通过log.info()\log.debug()\log.warning()...多种方式打日志
  • @Log:支持Log4j、Slf4j,日志功能, 具体Log4j没用过, 后面来补
  • @Accesors(chain = true):
    平常给一个对象赋值的时候我们需要person1.setAge(6);person1.setName('张三'); 使用这个注解后直接person1.setAge(6).setName('张三');进行链式编程;
  • @Builder:使用此注解进行对象的构建,函数式编程/链式编程,省去逐行字段set。
    CarLombok build = CarLombok.builder().id(1).type("string").price(88.8).level('a').build();
    System.out.println(build.toString());
  • @AllArgsConstructor:生成该类的全部参数的构造函数, 不能生成部分参数的构造函数,如果想要生成部分参数的构造函数还是需要手动生成的;如果加上这个注解后相当于类中增加了一个全部参数的构造函数, 因此之前其他代码中用无参构造函数new的对象可能会报错, 我们还需要手动加上@NoArgsConstructor;即@AllArgsConstructor和@NoArgsConstructor一般一起使用 一般不用全部参数的构造方法, 我们习惯自己new完一个对象用set方法去赋值
  • @NoArgsConstructor:生成无参构造函数
  • @RequiredArgsConstructor:生成指定类型(final ,@NonNull)
  • @Getter和@Setter
  1. 可以为单个成员变量设置get方法
  2. 可以为所有成员变量设置get、set方法 。同时可以为某个成员变量设置其他权限(默认public)、或设置取消get/set方法
  3. 无法为static设置get/set方法,只为final类型设置get方法
  • @ToString等: 生成该类的get() set() tostring()方法

ToString只能加在类上,自动生成ToString方法,使用exclude排除多个字段,of必须包含哪些字段。

  • @EqualsAndHashCode

生成equals方法、canEqual(判断是否属于Car类)、hashCode方法。也可以进行相等比较的排除,指定。

例如:@EqualsAndHashCode(exclude = {"字段1","字段2"})

  • @NonNull
    可以加在成员变量前,也可以加在方法参数前。用来指定某个字段不能为空
  • val:类比JS中的val(弱引用类型),在编译阶段确定类型,简化操作
    使用 val map = new HashMap<String, String>();
    替换 Map<String, String> map = new HashMap<>();
  • @Cleanup:对资源流进行清理
    @Cleanup InputStream in = new FileInputStream("filepath");
    @Cleanup OutputStream out = new FileOutputStream("filepath2");

4.5Lombok原理

本节内容涉及java编译过程大家可以去了解一下, 同时还有一些注解相关的API;

学习注解就一定要学习java的反射, 有关注解和反射的知识可以查看我的另一篇博客

  • 没错, 上篇那个博客啥都没, hhh 待补!!!, 不过你可以查看下面这些内容
    下面的内容都是从这个视频学的, 这个视频后半部分还讲解了Spring是如何通过注解实现对象的代理的, 但是我只是知道它执行的顺序, 还没有彻底搞懂反射, 等我补完反射就来补SpringBoot项目的启动流程



    为什么说注解也是一个类呢?

Java规范:JSR 269(Java Specification Requests) 插件化注解处理API(Pluggable Annotation Processing API)

JDK6提供的特性,在 Javac编译期(SOURCE标识)利用注解,在字节码文件中生成get、set等方法

Java编译器执行过程:

查看编译后的字节码文件:

  • 为什么说Lombok在源码阶段不生效, 他只是在java编译的时候在字节码文件中生成get\set方法
    以@Data为例,我们查看它的源码发现:

JsonUtil

  1. Json <> Bean, 例如 将一个对象以string字符串的方式存储到redis的string中

BeanUtil

  1. Bean<>Map, 例如将一个对象以hashmap键值对的形式存储到redis的hash中
  2. JsonObject<>BeanUtil

StringUtil

  1. isNotBlank:判断一个String是否为空(空是指""或" "这种)

代码习惯

  • 所有常量均定义宏
    写宏的时候 用下划线区分BEGIN_TIMESTAMP
  • 凡是自动拆箱都可能导致空指针(比如返回的是Boolean, 但是这是个null, 那么没办法拆箱成boolean了)
java 复制代码
public boolean{
	Boolean success = ...
	//return success;
	return Boolean.TRUE.equals(success);
}
  • 少些嵌套

    java 复制代码
    if(success)
    {
    	try{}catch{}finally{}
    }
    ....
    改成
    if(!sucess)
    {
    	...
    }
    try{}catch{}finally{}
  • 注释

快捷方式

soutv:打印一个value

fori:循环

cmd + n插入构造函数, 重写方法,实现方法等

相关推荐
李昊哲小课4 小时前
Spring Boot SSE 实时推送教程
spring boot·websocket·flux·sseemitter
刺客码4 小时前
Layui 表格固定列行高错位问题解决方案
前端框架·layui·jquery·web
wno7045 小时前
Spring Boot WebFlux增删改查
java·spring boot·后端
行百里er7 小时前
Spring Insight 里如何把 Span 收成一条链路
spring boot·spring cloud·监控
xcl09257 小时前
24小时自助健身房系统软件开发实战指南:从架构到部署
java·spring boot
ID34610744209 小时前
【课程设计】基于Spring Boot+Vue的游戏账号租赁系统的设计与实现-计算机毕设 附源码50345
javascript·vue.js·spring boot·python·node.js·php·课程设计
COOLMO研究AI10 小时前
Next.js App Router 中 sitemap、robots 与 canonical 的配置与排查
前端·web·js·网站优化
ji_shuke11 小时前
Apple Pay Web 跨浏览器二维码支付接入与踩坑实战:从 Safari 到 Windows Chrome
web·apple pay
宸津-代码粉碎机11 小时前
微服务线上踩坑复盘:接口超时、负载倾斜隐形问题根治方案(生产级配置)
java·大数据·人工智能·python·spring
LuTshoes11 小时前
spring ai 实战RAG(4)-模块化RAG
java·人工智能·spring