0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Lombok版的构造器注入方式

科技绿洲 来源:了不起 作者:了不起 2023-09-25 10:50 次阅读

做开发的同学可能都会发现, IDEA 在我们经常使用的@Autowired注解上添加了警告: Field injection is not recommended, 即: 不推荐使用属性注入。那怎么解决这个问题呢?


问题原因

违背单一职责原则

因为现在的业务一般都会使用很多依赖, 但拥有太多的依赖通常意味着承担更多的责任,而这显然违背了单一职责原则。

依赖Spring

@Autowired由 Spring 提供,而@Resource是JSR-250提供的,它是Java标准。前者会警告,而后者不警告,就是因为前者导致了应用与框架的强绑定,若是换成其他IOC框架,则不能够成功注入了。其实对于这方面,我认为在大多数情况时是不会有什么问题的。

其他

我看到网络上有一些其他方面的总结,比如:因为是 ByType 注入, 因此有可能会出现两个相同的类型bean,进而导致Spring装配失败;不能像构造器那样注入不可变的对象等,这类问题需要结合个人实际开发进行判断。

对于@Autowired使用方面,它虽然是将业务代码和框架进行了强绑定,但字段注入确实大幅简化了代码。能够有效提高代码简洁性,让依赖注入的事情交给IOC容器,省时省力,这也是它的优点,我们应该在实际使用中追求平衡,否则将为了过度追求松耦合而得不偿失。

其他注入方法

除了使用@Autowired以外,我们其实也有几种好用的方式。使用@Resource替代@Autiwired方法是其中一种,只需要改变一个注解,这里就不展示了。

Setter注入

能够通过懒加载的方式解决循环依赖,类中的依赖在需要用到的时候才会注入。另外,setter注入方式很灵活,注入的对象还能改变。

@RestController
public class DemoController {

    private DemoService demoService;

    /*
     * 基于set注入
     * */
    @Autowired
    public void setDemoService(DemoService demoService) {
        this.demoService = demoService;
    }

}

这种方法也使用了@Autowired注解,但是它是作用于成员变量的Setter函数上,而不是像Field注入一样作用于成员变量上。

这是三种注入方式中最灵活的,这个灵活就是它的缺点。Setter注入的依赖不能保证依赖不可变。

构造器

@RestController
public class DemoController {

    private DemoService demoService;

    /*
    * 基于构造方法的注入
    * */
    public DemoController(DemoService demoService) {
        this.demoService = demoService;
    }
}

它的好处在于,采用了构造方法注入,这种方式对对象创建的顺序会有要求,它将避免循环依赖问题。是最可靠的方法。

但其也有缺点,假如类中需要注入的依赖比较多,就会显得构造方法很臃肿,缺乏可读性。另外,构造器注入不能解决循环依赖问题。

构造器简化版(推荐)

首先,需要引入lombok依赖。

< dependency >
    < groupId >org.projectlombok< /groupId >
    < artifactId >lombok< /artifactId >
< /dependency >

随后,我们在创建时就可以使用@RequiredArgsConstructor注解,它将帮我们创建构造器,注意,属性必须添加 final 关键字。

@RestController
@RequiredArgsConstructor
public class DemoController {
    /*
     * 用@RequiredArgsConstructor注解,这个使用方式也可以应用于service层
     * */
    private final DemoService demoService;

}

通过查看编译结果,发现Lombok自动生成了构造方法,非常简便。

总结

最不推荐使用的是 属性注入 ,除了省力以外没有好处。

Setter注入构造器注入 各有优劣,需要根据实际情况选择。

最推荐使用 Lombok版的构造器注入 方式,既简单又可靠。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2953

    浏览量

    104506
  • 框架
    +关注

    关注

    0

    文章

    398

    浏览量

    17415
  • 代码
    +关注

    关注

    30

    文章

    4733

    浏览量

    68277
  • spring
    +关注

    关注

    0

    文章

    338

    浏览量

    14299
收藏 人收藏

    评论

    相关推荐

    ADC的规则通道和注入通道混合使用(转)

    DMA 请求,并将转换的数据从 ADC_DR 寄存传输到用户指定的目的地址,还有注入方式转换后数据存储到 ADC_DRJx寄存和规则方式
    发表于 01-19 10:40

    给AVR 单片机构造移位寄存方式的输出函数

    给AVR 单片机构造移位寄存方式的输出函数
    发表于 05-14 15:07 37次下载

    小巧的信号注入

    小巧的信号注入
    发表于 04-20 11:35 601次阅读
    小巧的信号<b class='flag-5'>注入</b><b class='flag-5'>器</b>

    S注入法与电压互感的特殊接线方式

    S注入法与电压互感的特殊接线方式 摘 要:基于“S注入法”的选线定位保护新原理的TY系列选线定位保护已大量运行于国内电
    发表于 07-11 16:02 925次阅读
    S<b class='flag-5'>注入</b>法与电压互感<b class='flag-5'>器</b>的特殊接线<b class='flag-5'>方式</b>

    “S注入法”与电压互感的特殊接线方式

    “S注入法”与电压互感的特殊接线方式 基于“S注入法”的选线定位保护新原理的TY系列选线定位保护已大量运行于国内电力系统。“S注入法”需
    发表于 07-23 09:39 1941次阅读
    “S<b class='flag-5'>注入</b>法”与电压互感<b class='flag-5'>器</b>的特殊接线<b class='flag-5'>方式</b>

    Lombok开发插件使用小技巧

    0x01:Lombok简介 Lombok 是一款 Java开发插件,使得 Java 开发者可以通过其定义的一些注解来消除业务工程中冗长和繁琐的代码,尤其对于简单的 Java 模型对象(POJO)。在
    的头像 发表于 06-12 18:07 1742次阅读

    重演自己如何掉入Lombok的戏法陷阱

      https://www.ramostear.com/blog/2020/04/28/uk1860p8.html   如果您正在阅读此文,想必您对Project Lombok已经有了一段时间的了解
    的头像 发表于 10-28 11:29 1177次阅读

    Lombok同时使用@Data和@Builder的一个必须要避开的巨坑

    构造报错!编译不通过。如下图: Lombok @Data和@Builder分别单独分析用法 Lombok使⽤@Data可以⽣成⽆参构造和类
    的头像 发表于 10-11 18:14 1931次阅读

    AC/DC的基础:变压方式和开关方式的比较

    前文已针对采用变压方式和开关方式AC/DC转换,概略说明一下AC/DC转换的工作状况和电路,在此则是比较两者,并整理各自的优缺点。如果比较电路构造,会发现因转换
    发表于 02-15 16:12 679次阅读
    AC/DC的基础:变压<b class='flag-5'>器</b><b class='flag-5'>方式</b>和开关<b class='flag-5'>方式</b>的比较

    探讨Spring框架中的属性注入技术

    在本文中,我们深入探讨了 Spring 框架中的属性注入技术,包括 setter 注入构造注入、注解式属性
    的头像 发表于 06-14 09:37 893次阅读
    探讨Spring框架中的属性<b class='flag-5'>注入</b>技术

    Lombok的使用

    在平时我们工作的时候,我们经常会使用 toString() 方法来输出一个对象的一些属性信息。Lombok 给我们提供了一个自动生成 toString() 代码的注解,可以减少代码行数,如果代码属性
    的头像 发表于 09-25 14:03 752次阅读

    Lombok如何派上用场

    Java的 record 关键字是Java 14中引入的一个新的语义特性。record 对于创建小型不可变的对象非常有用。另一方面,Lombok 是一个Java库,可以自动生成一些已知的模式为
    的头像 发表于 10-08 15:39 282次阅读

    什么是SQL注入?Java项目防止SQL注入方式

    Java项目防止SQL注入方式 这里总结4种: PreparedStatement防止SQL注入 mybatis中#{}防止SQL注入 对请求参数的敏感词汇进行过滤 ngin
    发表于 10-16 14:26 534次阅读

    Spring依赖注入方式

    可维护性和可测试性。同时,Spring 提供了多种依赖注入方式,以满足不同场景下的需求。本文将详细介绍 Spring 依赖注入方式构造
    的头像 发表于 11-22 15:12 456次阅读

    Spring中依赖注入的四种方式

    详细介绍四种常见的依赖注入方式。 第一种方式构造函数注入构造函数
    的头像 发表于 12-03 15:11 1872次阅读