开发框架学习笔记
- 一.Spring SpringMVC SpringBoot
- 三者的联系
- SpringMVC工作原理
- 二.SpringBoot的学习
- 框架学习
- 2.各个类之间的继承和实现关系
- 3.理解面向对象的思想(其实这个想写在2中的)
- 四.开发常用工具Lombok
- 4.0说在前面(如何快速使用Lombok)
- 4.1了解Lombok
- 4.2Lombok的作用一:减少代码冗余
- 4.3Lombok的作用二:方便打日志
- 4.4Lombok使用方法(各个注解作用)
- 4.5Lombok原理
- JsonUtil
- BeanUtil
- StringUtil
- 代码习惯
- 快捷方式
一.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中加入如下依赖
<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打日志的时候不仅仅可以直接打印,还可以用如下这种占位符的方法打印变量
/**
* 实现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
- 可以为单个成员变量设置get方法
- 可以为所有成员变量设置get、set方法 。同时可以为某个成员变量设置其他权限(默认public)、或设置取消get/set方法
- 无法为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
- Json <> Bean, 例如 将一个对象以string字符串的方式存储到redis的string中
BeanUtil
- Bean<>Map, 例如将一个对象以hashmap键值对的形式存储到redis的hash中
- JsonObject<>BeanUtil
StringUtil
- isNotBlank:判断一个String是否为空(空是指"“或” "这种)
代码习惯
- 所有常量均定义宏
写宏的时候 用下划线区分BEGIN_TIMESTAMP
- 凡是自动拆箱都可能导致空指针(比如返回的是Boolean, 但是这是个null, 那么没办法拆箱成boolean了)
public boolean{
Boolean success = ...
//return success;
return Boolean.TRUE.equals(success);
}
- 少些嵌套
if(success) { try{}catch{}finally{} } .... 改成 if(!sucess) { ... } try{}catch{}finally{}
- 注释
快捷方式
soutv:打印一个value
fori:循环
cmd + n插入构造函数, 重写方法,实现方法等