嘎里三分熟
  • 首页
  • JMusic
  • TSBay
  • 常用工具
  • About Me
  • 留言板
一行代码一世浮生
  1. 首页
  2. Java web
  3. Spring基础
  4. 正文

Spring深入浅出(一):@Autowired的究极奥义

2017年07月26日 1735点热度 3人点赞 0条评论

一、初识

Spring 的自动注入,注解方式就是使用 @Autowired,Spring 会帮助我们自动注入已经使用了 @component、@controller、@service、@repository这些注解标记过的类,从此释放我们的双手,不需要再手动 new 对象了。每个初学者都伸手就是下图的写法:

autowired01.png

二、再探

但是今天看了下智能的 IDE 给的警告信息,瞬间觉得自己之前都是使用的 low 爆了的 BI。

autowired02.png

正如上图:其实 Spring 团队建议我们的是,使用构造函数的形式来注入,而不是简单的以成员变量的方式直接注入,即如下图:

autowired03.png

那么,这么做有什么好处呢,我们从最基本的点开始着手。

自动注入,是啥意思呢?简言之就是 Spring 会自动帮我们 new 对象,而 new 对象就是调用构造函数,所以,spring 建议我们使用构造函数的形式来注入,但是必须得注意,上图所见的是有参构造,而如果被注入的类里面存在一个无参构造,那么 spring 便会去调用这个无参构造,而不会调用有参构造。

如下 demo,有一个类 AutowiredTarget,内部有有参和无参两种构造同时存在,两种情况都跑一次,结果见下图:

autowired04.png

1501036330159048.png

好,我们跑一个极端的例子,AutowiredTarget 这个类里面有两个有参构造会怎么样?我猜会异常,见下图:

autowired06.png

果然报错了,毕竟我们使用了两个 @Autowired,其实,它spring 默认的会去找有 @Autowired 注解的构造,没有的话就默认无参构造。

三、进化

其实,说到底, Spring 为什么会建议,或者说是要求我们这么做,其实下图这个 demo 能够很好地阐明缘由:

demo 很简单,项目启动时候异常,缘由也很简单,其实就是一个顺序的问题,

因为注入一个类的时候,内部的构造函数被调用的优先级是高于内部成员变量的,即,上图中的构造函数被注入了,但是此时的 成员变量 people 还没有被赋值(即还没有被注入),所以才有了空指针的异常。

四、总结

洋洋洒洒写了一大段,其实想阐述的就是简单一个观点:

@Autowired 可以对成员变量、方法以及构造函数进行注释,而 spring 强烈建议我们使用构造函数的形式来注入。

缘由就是构造函数的优先级较高,不会出现空指针异常。

另外,Java 类中变量的初始化顺序为:静态变量或静态语句块 –> 实例变量或初始化语句块 –> 构造方法 –> @Autowired。

最后,spring 建议我们使用 final,我想有可能是因为“注入”的这个过程是单例的吧。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: Autowired JavaWeb Spring SpringMVC
最后更新:2017年07月26日

GoldenJet

爱折腾技术的90后漫威小死忠程序员一枚

点赞
下一篇 >

文章评论

取消回复

通过电子邮件订阅博客

分类目录
  • BootStrap (2)
  • Bug集中营 (6)
  • Java web (3)
  • JavaScript (7)
  • Java基础 (17)
  • Java工具 (5)
  • Linux (3)
  • Python (3)
  • SpringBoot (14)
  • Spring基础 (8)
  • thymeleaf (1)
  • 娱乐 (3)
  • 小谈 (2)
  • 常用工具 (7)
  • 技术分析集 (5)
  • 技能 (10)
  • 源码 (4)
  • 科普类 (1)
  • 算法 (9)
  • 踩坑记 (5)
文章归档
  • 2020年11月 (1)
  • 2020年7月 (1)
  • 2020年4月 (2)
  • 2020年3月 (1)
  • 2020年1月 (1)
  • 2019年11月 (1)
  • 2019年10月 (1)
  • 2019年9月 (1)
  • 2019年8月 (1)
  • 2019年7月 (2)
  • 2019年5月 (2)
  • 2019年4月 (2)
  • 2019年3月 (3)
  • 2019年2月 (2)
  • 2019年1月 (2)
  • 2018年12月 (2)
  • 2018年11月 (3)
  • 2018年10月 (3)
  • 2018年9月 (2)
  • 2018年8月 (3)
  • 2018年7月 (2)
  • 2018年5月 (1)
  • 2018年4月 (3)
  • 2018年3月 (2)
  • 2018年2月 (3)
  • 2018年1月 (5)
  • 2017年12月 (2)
  • 2017年11月 (3)
  • 2017年10月 (1)
  • 2017年9月 (1)
  • 2017年8月 (1)
  • 2017年7月 (7)
  • 2017年6月 (5)
  • 2017年5月 (1)
  • 2017年4月 (2)
  • 2017年3月 (4)
  • 2017年2月 (2)
小伙伴友链
  • 前端驿站

COPYRIGHT © 2017-2020 嘎里三分熟. ALL RIGHTS RESERVED.

浙ICP备17005575号-1

浙公网安备 33010802009043号