目录

  • `Spring` 的注入方式
    • 属性注入
    • `set` 方法注入
    • 构造方法注入
  • `Spring` 官方推荐哪种方式
    • `Spring 3.0`
    • `Spring 4.0`
    • `Spring 3.0` 与 `Spring 4.0`
    • 属性注入问题

Spring 的注入方式

首先来看看 Spring 中的实例该如何注入,总结起来,无非三种方式

  • 属性注入
  • set 方法注入
  • 构造器注入

属性注入

属性注入是大家最为常见也是使用最多的一种注入方式了,代码如下

@Service
public class BService {@AutowiredAService aService;//...
}

这里使用 @Autowired 注解注入。另外也有 @Resource 以及 @Inject 等注解,都可以实现注入

set 方法注入

set 方法注入太过于臃肿,实际上很少使用

@Service
public class BService {AService aService;@Autowiredpublic void setaService(AService aService) {this.aService = aService;}
}

这代码看一眼都觉得难受,坚决不用

构造方法注入

构造方法注入方式如下

@Service
public class AService {BService bService;@Autowiredpublic AService(BService bService) {this.bService = bService;}
}
  • 如果类只有一个构造方法,那么 @Autowired 注解可以省略
  • 如果类中有多个构造方法,那么需要添加上 @Autowired 来明确指定到底使用哪个构造方法

Spring 官方推荐哪种方式

Spring 3.0

Spring 3.0 的文档(https://docs.spring.io/spring-framework/docs/3.0.x/reference/beans.html),里边有如下一段话


英文水平有限,大概翻译了下。重点看加粗部分,也就是说在 Spring 3.0 时代,官方还是提倡 set 方法注入的

Spring 4.0

Spring 4.0 的文档(https://docs.spring.io/spring-framework/docs/4.0.x/spring-framework-reference/htmlsingle/#beans-setter-injection),里边有如下一段话


就是说 Spring 团队在 Spring 4.0 时代倡导通过构造方法完成注入

  • 通过构造方法注入的方式,能够保证注入的组件不可变,并且能够确保需要的依赖不为空
  • 此外,构造方法注入的依赖总是能够在返回客户端(组件)代码的时候保证完全初始化的状态

上面这段话主要说了三件事

  • 依赖不可变:这个好理解,通过构造方法注入依赖,在对象创建的时候就要注入依赖,一旦对象创建成功,以后就只能使用注入的依赖而无法修改了,这就是依赖不可变(通过 set 方法注入将来还能通过 set 方法修改)
  • 依赖不为空:通过构造方法注入的时候,会自动检查注入的对象是否为空,如果为空,则注入失败;如果不为空,才会注入成功
  • 完全初始化:由于获取到了依赖对象(这个依赖对象是初始化之后的),并且调用了要初始化组件的构造方法,因此最终拿到的就是完全初始化的对象了

Spring 3.0Spring 4.0

Spring3.0 文档中,官方推荐 set 方法注入,如果构造方法注入的话,属性太多可能会让代码变得非常臃肿,那么在 4.0 文档中,官方对这个说法也做了一些订正:如果用构造方法注入的时候,参数过多以至于代码过于臃肿,那么此时你需要考虑这个类的设计是否合理,这个类是否参杂了太多的其他无关功能,这个类是否做到了单一职责

属性注入问题

不过不知道有没有留意过,在 IDEA 里边,使用属性注入,会有一个警告⚠️


不推荐属性注入!why?

  • 属性注入其实有一个显而易见的缺点,那就是对于 IOC 容器以外的环境,除了使用反射来提供它需要的依赖之外,无法复用该实现类。因为该类没有提供该属性的 set 方法或者相应的构造方法来完成该属性的初始化。换言之,要是使用属性注入,那么你这个类就只能在 IOC 容器中使用,要是想自己 new 一下这个类的对象,那么相关的依赖无法就完成注入

日常开发应该还是属性注入较多,这个咱们不必纠结,代码该咋写还咋写,Spring 官方的态度了解一下即可,当然,如果项目允许,也不妨试试 Spring 推荐的代码规范

Spring的注入方式中,官方推荐哪种方式相关推荐

  1. Spring读取配置文件,获取bean的几种方式

    Spring读取配置文件,获取bean的几种方式 方法一:在初始化时保存ApplicationContext对象 代码: ApplicationContext ac = new FileSystemX ...

  2. 12月18日云栖精选夜读 | Java 中创建对象的 5 种方式!...

    作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象.然而这里有很多创建对象的方法,我们会在这篇文章中学到. Java中有5种创建对象的方式,下面给出它们的 ...

  3. 依赖注入(DI)的三种方式

    个人对依赖注入的理解是:为bean所代表的对象的属性赋值 .对象的属性有多种类型,主要包括基本数据类型.String.引用类型.集合类型.属性类型.空字符串以及空值null.在通过配置文件进行依赖注入 ...

  4. 在MySQL数据库中,这4种方式可以避免重复的插入数据!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:小小猿爱嘻嘻 wukong.com/question/674 ...

  5. bd2和mysql语法区别,经验:在MySQL数据库中,这4种方式可以避免重复的插入数据!...

    最常见的方式就是为字段设置主键或唯一索引,当插入重复数据时,抛出错误,程序终止,但这会给后续处理带来麻烦,因此需要对插入语句做特殊处理,尽量避开或忽略异常,下面我简单介绍一下,感兴趣的朋友可以尝试一下 ...

  6. Java中创建对象的几种方式

    Java中创建对象的几种方式 1.使用new创建对象,在堆上创建. 2.克隆 3.反序列化 4.反射创建对象 5.NIO中可以使用本地方法直接分配堆外内存. 转载于:https://www.cnblo ...

  7. C++使用命名空间中成员的三种方式

    通过简单的代码来介绍使用命名空间中成员的三种方式(我们最常用到的命名空间是是标准库std,下面的命名空间都以std为例): 使用作用域符:: 1 #include<iostream> 2 ...

  8. Java中创建对象的四种方式

    为什么80%的码农都做不了架构师?>>>    Java中创建对象的四种方式 (1) 用new语句创建对象,这是最常见的创建对象的方法.    (2) 运用反射手段,调用java.l ...

  9. python的命名空间_python中命名空间的三种方式介绍(附示例)

    本篇文章给大家带来的内容是关于python中命名空间的三种方式介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. python中的命名空间分三种: 内置的命名空间,在启动解 ...

  10. 【opencv学习笔记】第五篇:访问图像中像素的三种方式、ROI区域图像叠加和图像混合

    1. 访问图像中像素的三种方式 任何图像处理算法,都是从操作每个像素开始的.在OpenCV中,提供了三种访问每个像素的方法. 方法1:指针访问:C操作符[] 方法2:迭代器iterator 方法3:动 ...

最新文章

  1. 我就不信看完这篇你还搞不懂信息熵
  2. 【LeetCode】two num 利用comparable接口 对对象进行排序
  3. 最深刻最通俗的HTTPS 原理详解,图文并茂
  4. SEO三种职位类型:编辑型SEO、技术型SEO、营销型SEO详解
  5. 3800元!爆料大神怒赞谷歌Pixel 6:这是今年最好看手机!
  6. Android USB Audio accessory设备
  7. net core上传文件异常:Multipart body length limit 16384 exceeded.
  8. 算法:回溯七 Permutation Sequence数组全排列定位
  9. javascript 实现下载的几种方法
  10. Java常用算法手册-01算法概述
  11. 02333软件工程要点及考点
  12. Htmlcssjs 图片轮播,加箭头
  13. 中文论文网站、英文论文网站、专业领域论文网站(学术狗必备的21个论文网站)
  14. 上传大文件报错413问题处理
  15. HTTP 的前世今生
  16. 【SQL面试】WHERE 1=1 到底是啥意思?
  17. 虚拟机防火墙关了怎么端口还是不能访问
  18. 时光机与流浪者-我的2017
  19. 自己动手爬取免费代理IP
  20. 软件测试学习教程(一)-学习路线图

热门文章

  1. 计算机机房建设公司 武汉,武汉信息化机房建设企业
  2. 2020 快手 被吊打面经
  3. JAVA设计模式之模板方法模式-场景、例子、深入
  4. Logistic Regression分类器与softmax分类器
  5. 使用LaTeX给PDF加背景
  6. 使用Caronte在CTF比赛中完成网络流量分析
  7. 680.验证回文字符串(力扣leetcode) 博主可答疑该问题
  8. 编译exe不弹窗口_详解matlab mbuild -setup找不到C++编译器解决方案
  9. linux 桌面共享xfce,漂亮而且轻量级的桌面-----xfce安装
  10. TCP和HTTP的区别和联系