文章目录
创建了一个java的springboot项目,设置版本为2.2.1,没有说为什么
如果配置其他版本,能正确运行吗?需要做出哪些改动?
首先查询官网,发现springcloud最新版本对于springboot的支持是2.4.3
然后发现springboot没有2.4.3的稳定版,那就按顺序选更早的GA版本(正式发布版本),2.3.10试试
成功了!
总结:修改版本需要查看官网
lombok插件能干什么
lombok这个插件有什么用途呢?还有哪些神奇的功能值得学习?
- 首先,都是英文的,用英文工具大概翻译一下
简单的说,lombak注解出现的原因是解决常用代码中,大量重复使用固定句式,代码不够简洁的问题
lombok对于@Data介绍,有一句很让我注意:
另外还提供了这张图:
就是说@Data除了实现了Getter,Setter之外,还重写了equals和hashcode
出于好奇,做了个测试:
OK,@Data大概是有gettersetter+hashCode+equals+toString
其他注解也看一下
- @Getter @Setter
添加getter,setter方法
特殊:boolean类型会变成isXx,比如 enable,getter会变成isEnable
说实话,对boolean的支持并不是很满意,boolean类型是我更关注的问题,其实Java Springboot中最佳支持应该是getXx,使用is有时候会造成奇怪的问题,比如json解析问题。
明显吞了一个is,json解析明显会出错。这种注解,我个人在项目上还是不喜欢用(至少不会整个Bean一起用),出问题不太好查找。其实常见的方式就是,整个项目的JavaBean都不要用boolean,考虑用YN代替以解决代码适配问题。这个问题本身,lombok没什么问题。
@Getter @Setter private boolean employed = true;
这种单注解还是可以用的,不过既然现在getter,setter有自动生成功能,为什么要这么用呢,嗯。。。。好像直接用自动生成还快一点
@NonNull 非空,如果空了立刻抛空指针
这个注解会考虑使用,缺点是侵入性太强,如果是已存在的项目,大概率不会在旧类上补
@TOSTRING 相当于toString
这个注解挺不错的,还可以继承父类,非常赞,写toString非常麻烦,直接输出的话,调试速度上可以有所增强,用它!
@EqualsAndHashCode(callSuper=true,exclude={“address”,“city”,“state”,“zip”}) hashCode+equals
事实上很多人都说继承这个是坑,我想问一句,人家写的文档你读了吗?
-
子类包含父类需要加callSuper=true
1.1 加callSuper=true
1.2不加callSuper=true -
只继承Object的类不能加这个参数,因为继承Object实际上比较的是对象地址,并不能达到重写equals的目的,因此给你编译错误的提示
3.补充,没有加callSuper的时候,这个注解还非常人性化的给你一个警告
如果对一个空对象做getter操作,往往是是通过IO取了数据之后,一般这种情况,如果忘记写空检查,本身就会抛异常,如果作为代码规范,是可行的,起提示作用
对于setter来说,是有用的m存数据的时候,忘记对某些字段处理m会抛异常的确能起到提示的作用,减少bug
@Data @ToString, @EqualsAndHashCode, @Getter, 加 @Setter
额外功能:
-
构造器会根据属性的情况进行生成,比如,如果有字段是使用final或者@NonNull修饰的,自动加相应字段的非空构造(防止忘记设置非空,final字段)
-
可以补充staticConstructor="of"属性,自动使用单例模式,工厂模式,调用时使用A.of()
-
写了bean,用了@Data注解
-
写了properties,配置了mysql,lombok日志
-
写了mapper,i使用了@MapperScan标注mapper包名
@CLEANUP 相当于try…finally块+close()
养成习惯后,就不会因为没有进行close操作而造成内存泄漏。事实上在项目中还真的发现过以前的程序员没有写close(),发现的方式是,刚好要对那个文件进行修改,可是开着idea居然一直被占用,没有释放。
示例:
@Cleanup ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.write(new byte[] {'Y','e','s'});
System.out.println(baos.toString());
和下面是等价的:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
baos.write(new byte[]{'Y', 'e', 's'});
System.out.println(baos.toString());
} finally {
baos.close();
}
@Synchronized 加专门的对象对方法加锁
对于实例方法,synchronized关键字将锁定当前对象(this),对于静态方法,则锁定类对象。这意味着开发人员控制范围之外的代码有可能锁定同一对象,从而导致死锁。
通常建议对单独的对象显式锁定,该对象专门用于此目的,而不是以允许主动锁定的方式公开。
老实说,这段话真的让我学到了。synchronized直接加载普通或者静态方法可能造成死锁。这个注解好棒啊。
@SneakyThrows如果方法内抛出检查异常,自动帮你该方法内原样抛出检查异常
这个是有点传奇色彩,正常情况下,子类抛出异常,父类也要跟着抛出异常;但是使用该注解的时候,只需要在子类使用就可以了,父类不用加,单独使用父类不会抛出异常
未加注解,父类不抛出
加注解,父类不抛出
缺点
- 可能和一些ORM框架冲突,所以提供了delombok可以再将注解转回源码,或者和源码对比
- 违背了注解存在的初衷(事实上现在很多框架都这样做了),注解开始对实际的代码产生影响,而非像原生代码一样,只起到注释作用
- 开发者使用了一些Java非公开的方法来进行处理,后续IDE和Java版本更新都可能造成使用上的风险
@Repository注解是什么?Spring的注解有哪些?
剩下的明天再补。。。。