Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >@Autowired注解你真的会用吗?Spring官方有话说

@Autowired注解你真的会用吗?Spring官方有话说

原创
作者头像
JavaEdge
修改于 2020-04-29 02:03:15
修改于 2020-04-29 02:03:15
6.5K0
举报
文章被收录于专栏:JavaEdgeJavaEdge

问题背景

使用@Autowired注解时,发现IDEA报了一个 warning!

追求极致的程序员怎么受得了这玩意?

在这里插入图片描述
在这里插入图片描述
  • 还得再点击那三小点点!然后继续点!
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

Spring Team recommends "Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies".

和阿里编码规范推荐似的,Spring团队推荐又来了:总是在您的bean中使用构造函数建立依赖注入。总是使用断言强制依赖”。

直接alt+enter写成这样子

在这里插入图片描述
在这里插入图片描述

好了,终于没大波浪了。

可是对真理充满追求的程序员又开始抓狂了,为啥这就不警告了呢????

在这里插入图片描述
在这里插入图片描述

众所周知,@Autowired 可以对成员变量、方法以及构造方法三种方式操作。

那么成员变量和构造方法设置又有什么区别呢?

@Autowired注入bean,相当于在配置文件中配置bean,并且使用setter注入。而对构造方法,就相当于是使用构造函数进行依赖注入了吧。莫非是这两种注入方法的不同???

@Autowired和构造方法执行顺序差异

先看一段代码,下面的代码能运行成功吗?

在这里插入图片描述
在这里插入图片描述

不能。

因为Java类会先执行构造方法,然后再给注解了@Autowired 的user注入值。

Java变量的初始化顺序:静态变量或静态语句块–>实例变量或初始化语句块–>构造方法–>@Autowired

所以在执行构造方法时,就会报错。报错信息可能会像

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name '...' defined in file ....class: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate ...: Constructor threw exception; nested exception is java.lang.NullPointerException

创建Bean时出错,出错原因是实例化bean失败,因为bean时构造方法出错,在构造方法里抛NPE。

解决方案

通过构造方法注入

在这里插入图片描述
在这里插入图片描述

使用构造方法注入,可以明确成员变量的加载顺序。

可细心地程序员不止于此,还有个问题

为什么要加final?

网上解释:

  1. spring配置默认的bean的scope是singleton,也就是启动后一直有。通过设置bean的scope属性为prototype来声明该对象为动态创建。但是,如果你的service本身是singleton,注入只执行一次。@Autowired本身就是单例模式,只会在程序启动时执行一次,即使不定义final也不会初始化第二次,所以这个final是没有意义的吧。可能是为了防止,在程序运行的时候,又执行了一遍构造函数;
  2. 或者是更容易让人理解的意思,加上final只会在程序启动的时候初始化一次,并且在程序运行的时候不会再改变。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
@Autowired注解你真的会用吗?Spring官方有话说:Always use constructor based dependency injection in your beans
和阿里编码规范推荐似的,Spring团队推荐又来了:总是在您的bean中使用构造函数建立依赖注入。总是使用断言强制依赖”。
JavaEdge
2020/05/27
2.1K0
@Autowired注解你真的会用吗?Spring官方有话说:Always use constructor based dependency injection in your beans
@Autowired的使用:推荐对构造函数进行注释
Spring Team recommends "Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies".
java架构师
2019/06/13
2.2K0
@Autowired:构造函数注入和变量注入
public TestController(TestService testService) {
chenchenchen
2019/09/03
5.7K0
@Autowired依赖注入为啥不推荐了
这几天更新升级了一下java编码神器IDEA,升级完进行日常开发,可能是以前用的IDEA版本比较老旧,升级之后发现之前的日常写法有了个warning提醒。来看图:
botkenni
2022/09/07
1.6K0
@Autowired依赖注入为啥不推荐了
怎样使用Spring的配置文件?带大家一起玩转Spring配置文件
创建一个maven工程,导入Spring需要的依赖,为了方便测试,我还导入了一个Junit测试包
我是一棵卷心菜
2022/01/18
1.4K0
@Autowired的使用--Spring规范解释,推荐对构造函数进行注释
Spring Team recommends "Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies.
ydymz
2018/09/10
4.3K0
Spring框架你敢写精通,面试官就敢问@Autowired注解的实现原理
小小白:@Autowired注解可以被标注在构造函数、属性、setter方法或配置方法上,用于实现依赖自动注入。
JavaQ
2020/05/11
6320
深度解析 Spring 源码:揭秘BeanFactory 之谜
BeanFactory是Spring框架中的一个核心接口,它提供了一种灵活的方式来管理Bean,并实现了IoC(控制反转)和DI(依赖注入)等特性,为应用程序提供了灵活、可扩展的对象管理和配置机制。
忆愿
2025/01/01
1410
深度解析 Spring 源码:揭秘BeanFactory 之谜
Java注解之@Autowired
在Java中,@Autowired注解的作用是将依赖关系自动注入到类中,它是Spring框架中的一个核心注解之一。@Autowired可以用于自动装配一个类的成员变量、构造函数或者方法,以实现依赖注入(Dependency Injection)。
用户4396583
2024/08/09
6390
Spring如何管理Bean的生命周期呢?
我们都知道,在面试的过程中,关于 Spring 的面试题,那是各种各样,很多时候就会问到关于 Spring的相关问题,比如 AOP ,IOC 等等,还有就是关于 Spring 是如何管理 Bean 的生命周期的相关问题,今天了不起就来和大家一起看看 Spring 是如何管理 Bean 的生命周期的。
Java极客技术
2024/05/28
1490
Spring如何管理Bean的生命周期呢?
Spring官网阅读(二)(依赖注入及方法注入)
依赖注入测试setter方法注入测试构造函数注入疑问:区别:方法注入:为什么需要方法注入:通过注入上下文(applicationContext对象)通过@LookUp的方式(也分为注解跟XML两种方式,这里只演示注解的)方法注入 之 replace-method依赖注入跟方法注入的总结:
程序员DMZ
2020/07/07
1.4K0
Spring官网阅读(二)(依赖注入及方法注入)
Spring注解-@Autowired注解使用
首先要知道另一个东西,default-autowire,它是在xml文件中进行配置的,可以设置为byName、byType、constructor和autodetect;比如byName,不用显式的在bean中写出依赖的对象,它会自动的匹配其它bean中id名与本bean的set**相同的,并自动装载。 @Autowired是用在JavaBean中的注解,通过byType形式,用来给指定的字段或方法注入所需的外部资源。 两者的功能是一样的,就是能减少或者消除属性或构造器参数的设置,只是配置地方不一样而已。 autowire四种模式的区别
SerMs
2022/04/11
1K0
Spring注解-@Autowired注解使用
【Spring】DI依赖注入的三种方式
上一篇文章介绍了@Bean注解的使用和扫描路径的配置,本文主要介绍如何将交给Spring管理的Bean对象怎样注入,也就是使用Bean对象
三三是该溜子
2025/01/13
2860
【Spring】DI依赖注入的三种方式
【Spring】如何解决Spring的循环依赖问题?这道面试题助我拿到了Offer!!
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:
冰河
2020/10/29
6500
【Spring】如何解决Spring的循环依赖问题?这道面试题助我拿到了Offer!!
Spring5.0源码深度解析之Spring是如何利用三级缓存解决循环依赖的问题
Spring已经成为了开发项目的不可缺少的组件了,我们在平常开发项目中难免会遇到以下这些情况,比如说,我有A类和B类,两个业务类都注入到Spring容器里了,且双方都互相注入了,这个时候就会造成循环依赖的问题,相信之前有很多开发者遇到这样的问题吧,不过现在Spring底层已经通过三级缓存来解决了这个循环依赖的问题了。
黎明大大
2021/03/09
1.6K0
Spring字段注入存在哪些问题,你知道吗?
昨天有个同学面试回来向我求助,说面试官问他Spring字段注入存在什么问题,他当时没有回答上来。
阿凯
2021/08/19
1.3K0
Spring字段注入存在哪些问题,你知道吗?
Spring常见面试题总结(超详细)
(原创不易,你们对阿超的赞就是阿超持续更新的动力!) (以免丢失,建议收藏) (------------------------------------------------------------------------) Spring是什么 Spring是一个轻量级的IOC和AOP容器框架。是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。 IOC让相互协作的组件保持松散的耦合,而AOP编程允许你把遍布于应用各层的功能分离出来形成可
是阿超
2021/10/21
9200
面试官:Spring中的注解@Autowired是如何实现的
现在面试,基本上都是面试造火箭????,工作拧螺丝????。而且是喜欢问一些 Spring 相关的知识点,比如 @Autowired 和 @Resource 之间的区别。魔高一丈,道高一尺。很快不少程
业余草
2021/12/06
4110
面试官:Spring中的注解@Autowired是如何实现的
Spring @Autowired 注解静态变量
通过日志我们可以非常明确的知道上面异常的主要原因就是因为 VisaRepository 这个变量没有初始化,简单来说就是没有被 @Autowired 上去。
HoneyMoose
2022/08/27
5380
Spring @Autowired 注解静态变量
spring官方文档 中文_Spring软件
https://docs.spring.io/spring/docs/5.2.5.BUILD-SNAPSHOT/spring-framework-reference/images/prototype.png本文档是对spring官方文档的解读,原文档参见Spring官方文档
全栈程序员站长
2022/11/01
3.7K0
spring官方文档 中文_Spring软件
推荐阅读
相关推荐
@Autowired注解你真的会用吗?Spring官方有话说:Always use constructor based dependency injection in your beans
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档