使用 @Autowired 依赖注入时警告不建议使用字段注入

这篇具有很好参考价值的文章主要介绍了使用 @Autowired 依赖注入时警告不建议使用字段注入。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在 Spring 中注入依赖时有字段注入构造器注入、Setter 方法注入三种注入方式。

字段注入缺点

无法注入 final 字段

在 Spring 2.5 中引入了 @Autowired 注解,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。在成员变量上使用 @Autowired 注解可以进行字段注入,如下:

public class UserController {
    @Autowired
    private UserService userService;
}

使用起来代码简洁,简单方便,可读性强。但是 Spring 官方不建议使用这种注入方式,在 IDEA 中使用字段注入时会出现黄色波浪线,如下所示:

使用 @Autowired 依赖注入时警告不建议使用字段注入

@Autowired 的本质是通过反射的方法完成属性注入,因此,@Autowired 会在对象创建完成之后执行,同时@Autowired 也无法在声明为 final 类型的字段上发生作用,否则会报尚未初始化错误:

使用 @Autowired 依赖注入时警告不建议使用字段注入

因为这些字段必须在类实例化时实例化。

与 Spring 容器耦合度高

其次,使用@Autowired 字段注入会增加与 Spring 容器的耦合程度,例如在测试类中测试 UserControllergetUser() 方法:

@Test
void contextLoads() {
    UserController userController = new UserController();
    userController.getUser();
}

由于在 getUser() 方法中调用了字段注入的 UserService ,所以运行时会报 NullPointerException 空指针异常:

使用 @Autowired 依赖注入时警告不建议使用字段注入

修改为使用 Spring 容器注入依赖后解决:

@Autowired
private UserController userController;

@Test
void contextLoads() {
    userController.getUser();
}

构造器注入(Spring 官方推荐)

在类构造器上使用 @Autowired 注解,在构造器中将对象注入 final 类型的字段,同时避免了出现空指针异常。

public class UserController {
    private final UserService userService;
    @Autowired
    public UserController(UserService userService) {
        this.userService=userService;
    }
}

但是当需要注入的对象有很多时,构造器的参数就会增多,代码就会变得臃肿起来。那么可以使用 Lombok 提供的注解来简化操作,在类上使用 @RequiredArgsConstructor 注解,将注入的字段注为 final 类型,如下:

@RequiredArgsConstructor
public class UserController {
    private final UserService userService;
}

Lombok 会自动生成含有 final 类型字段的构造器:

使用 @Autowired 依赖注入时警告不建议使用字段注入

但是构造器注入无法解决循环依赖的问题。

Setter 方法注入

Setter 方法注入是通过 set 的方式注入依赖,如下:

public class UserController {
    private UserService userService;
    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
}

这一方式可以解决循环依赖的问题,但是也不能注入 final 类型的字段。


总结:最好的解决方案是用构造器参数实现强制依赖,Setter 方法实现可选依赖。文章来源地址https://www.toymoban.com/news/detail-447466.html

到了这里,关于使用 @Autowired 依赖注入时警告不建议使用字段注入的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Boot进阶(57):Spring中什么时候不要用@Autowired注入 | 超级详细,建议收藏

            注解@Autowired,相信对于我们Java开发者而言并不陌生吧,在SpringBoot或SpringCloud框架中使用那是非常的广泛。但是当我们使用IDEA编辑器开发代码的时候,经常会发现@Autowired 注解下面提示小黄线警告,我们把小鼠标悬停在注解上面,可以看到这个如下图所示的警告信息

    2024年02月16日
    浏览(39)
  • IDEA使用@Autowired为什么会警告?

    在使用IDEA编写Spring相关的项目时,当在字段上使用@Autowired注解时,总会出现一个波浪线提示:”Field injection is not recommended.” 这让我不禁疑惑:我每天都在使用这种方式,为何不被推荐呢?今天,我决定深入探究其中的原因。 众所周知,Spring框架提供了三种可选的依赖注入

    2024年02月12日
    浏览(44)
  • 使用 @Autowired 为什么会被 IDEA 警告,应该怎么修改最佳?

    # 问题原因 关于这个问题,其实答案相对统一,实际上用大白话说起来也容易理解。 1.初始化问题 先看一下Java初始化类的顺序:父类的静态字段 父类静态代码块 子类静态字段 子类静态代码块 父类成员变量 父类构造代码块 父类构造器 子类成员变量 子类构造代码块 子类构

    2024年02月13日
    浏览(46)
  • 使用@Component时再使用@Resource或@Autowired时注入失败问题

    在 @Component 注解的类下,再使用了 @Resource 或 @Autowired 注解。如此操作会导致依赖注入失败。 这是因为spring加载它们的顺序不同,在使用 @Component 注解将bean实例化到spring容器内的时候,因为 @Autowired 是在这个bean之中的,此时 @Autowired 还未完成自动装载,所以导致依赖注入的

    2024年02月06日
    浏览(37)
  • SpringBoot使用@Autowired将实现类注入到List或者Map集合中

    最近看到 RuoYi-Vue-Plus 翻译功能 Translation 的翻译模块配置类 TranslationConfig ,其中有一个注入 TranslationInterface 翻译接口实现类的写法让我感到很新颖,但这种写法在Spring 3.0版本以后就已经支持注入 List 和 Map ,平时都没有注意到这一块,故此记录一下这种写法。 之前一般定义

    2024年02月14日
    浏览(40)
  • 关于在 springboot 中使用 @Autowired 注解来对 TemplateEngine 进行自动装配时,无法注入的问题。

    本文是基于江南一点雨的 Spring Boot+Vue 系列视频教程第 三 章的第三节,详情参考Spring Boot+Vue系列视频教程 在观看学习这一节时,发现当进行手动渲染 Thymeleaf 模板时,通过 @Autowired 注解来对 TemplateEngine 进行自动装配时,发现 idea 对其显示 No beans of \\\'TemplateEngine \\\' type of found。

    2024年02月02日
    浏览(44)
  • 【注解使用】使用@Autowired后提示:Field injection is not recommended(Spring团队不推荐使用Field注入)

    在使用 IDEA 开发 SpringBoot 项目时,在  Controller  类中使用注解  @Autowired  注入一个依赖出现了警告提示,查看其他使用该注解的地方同样出现了警告提示。这是怎么回事?由于先去使用了SpringBoot并没有对Spring进行系统性学习,所以做一个记录。 Field injection is not recommended(

    2024年02月12日
    浏览(39)
  • Spring Boot——@Autowired属性注入问题

    当我们在使用 @Autowired 属性注入时,会发现idea提示 Field injection is not recommended ,译为: 不推荐使用属性注入   要想了解Spring和idea之所以不推荐使用@Autowired属性注入,首先就要先了解Spring常用的注入方式:简单类型注入、集合类型注入, 域属性自动注入, 自动注入的类别, 空值注

    2024年02月06日
    浏览(44)
  • WPF使用依赖注入

    现在依赖注入在.Net里面已经普及,自己常写一些简单的demo倒是无所谓,但偶尔写一点正式的工程,也免不了要使用一下,于是总结了一下在WPF里面使用依赖注入。 在写简单Demo时候,通常是在MainWindow的构造函数里面直接做初始化,各种变量也都丢在MainWindow类里面。在使用依

    2024年02月11日
    浏览(33)
  • netCore使用依赖注入

    依赖注入是一种常用的设计模式,用于解耦组件之间的依赖关系。通过依赖注入,我们可以将一个组件所依赖的其他组件的创建和管理工作交给容器来完成,从而实现组件之间的解耦和灵活性 .NET Core提供了内置的依赖注入容器,使我们能够轻松地实现依赖注入。下面是使用依

    2024年02月16日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包