使用@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注入。而对构造方法,就相当于是使用构造函数进行依赖注入了吧。莫非是这两种注入方法的不同???
先看一段代码,下面的代码能运行成功吗?
不能。
因为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。
通过构造方法注入
使用构造方法注入,可以明确成员变量的加载顺序。
可细心地程序员不止于此,还有个问题
网上解释:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有