乐趣区

关于java:如何使用RequiredArgsConstructor注解

@Autowired 的注入过多, 这个别没什么问题,因为注入的字段是无限的。然而业务代码,不加正文,单文件长度超过 2000 行的亘古未有。注入的属性能达到十几个之多。这部分注入代码真是脏乱差。不仅如此,这些字段,还会在 IDE 里变成灰色,通知你未被初始化,代码变成了丑八怪。

事实上,Spring 从 4.0 开始,就 不 推 荐 使 用 属 性 注 入 模 式 了,起因是它能够让咱们疏忽掉一些代码可能变坏的隐患。你能够自行搜寻这个问题,咱们也不开展说了。既然 Spring 举荐应用显示的 Setter 和结构器形式,那咱们就切换一下实现计划。Setter 办法基本上用的人比拟少,因为它更加臭更加长。要是给每一个属性写一个 set 办法,我预计你即应用代码生成器也玩吐了。结构器注入那么,结构器的办法就成了咱们的首选。样例代码如下:

   public class GoodsServiceImpl implements GoodsSrv {private GoodsRepo goodsRepo;     private TagRepo tagRepo;     private TagRefRepo tagRefRepo;     private BrandRepo brandRepo;     private UnitRepo unitRepo;      public GoodsServiceImpl(             GoodsRepo goodsRepo,             TagRepo tagRepo,             TagRefRepo tagRefRepo,             BrandRepo brandRepo,             UnitRepo unitRepo) {this.goodsRepo = goodsRepo;         this.tagRefRepo = tagRefRepo;         this.tagRefRepo = tagRefRepo;         this.brandRepo = brandRepo;         this.unitRepo = unitRepo;         this.tagRepo = tagRepo;} }Spring 不须要退出其余注解,就能够应用结构器实现注入。问题是,咱们仍然要写很多代码。这个时候,你可能想到了 Lombok 的 AllArgsConstructor 注解。但它是针对于全副的属性的,如果类中有一些非 Bean  的属性,Spring 就会晕菜。这个时候,就能够应用 RequiredArgsConstructor 了。代码如下:@Service @RequiredArgsConstructor public class GoodsServiceImpl implements GoodsSrv {final GoodsRepo goodsRepo;     final TagRepo tagRepo;     final TagRefRepo tagRefRepo;     final BrandRepo brandRepo;     final UnitRepo unitRepo;} 咱们把须要注入的属性,批改成 final 类型的 (或者应用 @NotNull 注解,不举荐),这些属性将形成默认的结构器。Java 要求 final 类型的属性必须要初始化,如果没有构造方法代码就会变红。咱们能够看到批改之后的 IDE,宜人的灰色提醒也隐没了。

这样的代码,是十分简洁的。更高级一点 RequiredArgsConstructor 注解,你还能够像上面这样写。即便是把 @__ 换成 @_,或者换成 @___,也是能失常的运行。

  @RequiredArgsConstructor(onConstructor = @__(@Autowired))

它的意思是,给应用 Lombok 生成的结构器办法,退出一个 @Autowired 注解。这是彻头彻尾的 Lombok 语法,不过当初的 Spring 曾经不须要退出这样的注解就能运行了。

退出移动版