一个冷门Lombok注解与Spring的结合
序
说到Lombok
,大部分人可能都停留在@Data
注解可以同时生成getter/setter
、toString
、equals
和hashCode
等方法;@NoArgsConstructor/@AllArgsConstructor
可以生成无参和全参构造器。确实Lombok
的设计初衷也是为了生成代码。
有些人因为需要安装插件而拒绝了Lombok
,觉得这样会要求团队内所有成员都安装插件。诚然,这是一个还说得过去的理由。但是这并不足以让我们拒绝Lombok
。Lombok
所做的事情是在改变Java
,有些人觉得它改变了Java
语法是破坏了Java
,那有没有想过,也许Java
一直以来的设计就是不好的存在呢?业务系统中出现的无数getter/setter
方法,动辄几百行的实体类,阅读体验真的好吗?Lombok
是在改变Java
,我们只不过是在拥抱变化。Spring Boot
已经把Lombok
加入预定义依赖中了;Apache ShardingSphere
的开发规范中明确要求优先使用Lombok
代替构造器、getter/setter
方法和log
变量;就连Java14
也借鉴了Lombok
思想提出了record
语法。我们为什么还要去拒绝Lombok
呢?
所以,从今天起,开始拥抱Lombok
吧!
一个冷门注解:@RequiredArgsConstructor
很多人都知道@RequiredArgsConstructor
这个注解,但是却从未使用过。如果你也一样,那就得好好看看我这篇文章了,看完之后也许你就会发现新的大陆!
Spring
的依赖注入
故事还得从Spring
的依赖注入开始说起…
依赖注入的两大变体:
- 构造函数注入
setter
方法注入
但是现在业务开发中却很少使用这两种依赖注入方式,而是使用@Autowired
注解进行自动装配。不管是业务层Service
还是仓储层MyBatis
框架的Mapper
或者其它等等,业务代码写起来大概是下面这个样子的:
1 |
|
这样的@Autowired
字段少则三五个,多则一二十个。而且在IDEA
中,XXXService
上面的@Autowired
注解会有一条黄色的下划线:Field injection is not recommended
;对于XXXMapper
类来说,变量名还会有一条红色的下划线:Could not autowire. No beans of 'XXXMapper' type found.
,虽然运行起来不会报错,但这样的警告和报错着实让人看起来很不舒服。
有人说可以用@Resource
注解来代替@Autowired
,这样就不会出现警告和报错了。诚然,这样做可以解决问题,@Resource
默认优先按beanName
自动注入,@Autowired
默认优先按beanType
自动注入。这是解决问题的一种方式。
@Resource
注解是JSR-250
规范提供的注解,而@Autowired
注解是Spring
提供的。这点不足以称为暇疵。
Lombok
的优雅
如何使用Lombok
来解决这个问题?
我们关注一下构造函数注入的写法:
1 |
|
它要求成员变量是final
类型,同时构造函数上的@Autowired
是可选的。
而@RequiredArgsConstructor
刚好是为被声明为final的字段生成构造器的注解。
于是我们的写法就变得优(zhuang
)雅(bi
)起来:
1 |
|
这样编译后的字节码如下:
1 |
|
这不就是标准的Spring
构造函数注入方式吗?甚至我们还可以把@Autowired
注解给加上:
1 |
|
这样编译后的构造函数上就会加上@Autowired
注解。
onConstructor = @_(@Autowired)
中间的@_
还可以继续加下划线_
:
1 |
即使你像上面这样写,代码也不会报错,能正常运行。
这样我们就只用写一个注解就可以完成任意多个属性的注入,Lombok
就是这么优(zhuang
)雅(bi
)!所以请尽情地拥抱Lombok
吧!