Spring的注入方式中,官方推荐哪种方式
目录
- `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.0
与 Spring 4.0
在 Spring3.0
文档中,官方推荐 set
方法注入,如果构造方法注入的话,属性太多可能会让代码变得非常臃肿,那么在 4.0
文档中,官方对这个说法也做了一些订正:如果用构造方法注入的时候,参数过多以至于代码过于臃肿,那么此时你需要考虑这个类的设计是否合理,这个类是否参杂了太多的其他无关功能,这个类是否做到了单一职责
属性注入问题
不过不知道有没有留意过,在 IDEA
里边,使用属性注入,会有一个警告⚠️
不推荐属性注入!why?
- 属性注入其实有一个显而易见的缺点,那就是对于
IOC
容器以外的环境,除了使用反射来提供它需要的依赖之外,无法复用该实现类。因为该类没有提供该属性的set
方法或者相应的构造方法来完成该属性的初始化。换言之,要是使用属性注入,那么你这个类就只能在IOC
容器中使用,要是想自己new
一下这个类的对象,那么相关的依赖无法就完成注入
日常开发应该还是属性注入较多,这个咱们不必纠结,代码该咋写还咋写,Spring
官方的态度了解一下即可,当然,如果项目允许,也不妨试试 Spring
推荐的代码规范
Spring的注入方式中,官方推荐哪种方式相关推荐
- Spring读取配置文件,获取bean的几种方式
Spring读取配置文件,获取bean的几种方式 方法一:在初始化时保存ApplicationContext对象 代码: ApplicationContext ac = new FileSystemX ...
- 12月18日云栖精选夜读 | Java 中创建对象的 5 种方式!...
作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象.然而这里有很多创建对象的方法,我们会在这篇文章中学到. Java中有5种创建对象的方式,下面给出它们的 ...
- 依赖注入(DI)的三种方式
个人对依赖注入的理解是:为bean所代表的对象的属性赋值 .对象的属性有多种类型,主要包括基本数据类型.String.引用类型.集合类型.属性类型.空字符串以及空值null.在通过配置文件进行依赖注入 ...
- 在MySQL数据库中,这4种方式可以避免重复的插入数据!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:小小猿爱嘻嘻 wukong.com/question/674 ...
- bd2和mysql语法区别,经验:在MySQL数据库中,这4种方式可以避免重复的插入数据!...
最常见的方式就是为字段设置主键或唯一索引,当插入重复数据时,抛出错误,程序终止,但这会给后续处理带来麻烦,因此需要对插入语句做特殊处理,尽量避开或忽略异常,下面我简单介绍一下,感兴趣的朋友可以尝试一下 ...
- Java中创建对象的几种方式
Java中创建对象的几种方式 1.使用new创建对象,在堆上创建. 2.克隆 3.反序列化 4.反射创建对象 5.NIO中可以使用本地方法直接分配堆外内存. 转载于:https://www.cnblo ...
- C++使用命名空间中成员的三种方式
通过简单的代码来介绍使用命名空间中成员的三种方式(我们最常用到的命名空间是是标准库std,下面的命名空间都以std为例): 使用作用域符:: 1 #include<iostream> 2 ...
- Java中创建对象的四种方式
为什么80%的码农都做不了架构师?>>> Java中创建对象的四种方式 (1) 用new语句创建对象,这是最常见的创建对象的方法. (2) 运用反射手段,调用java.l ...
- python的命名空间_python中命名空间的三种方式介绍(附示例)
本篇文章给大家带来的内容是关于python中命名空间的三种方式介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. python中的命名空间分三种: 内置的命名空间,在启动解 ...
- 【opencv学习笔记】第五篇:访问图像中像素的三种方式、ROI区域图像叠加和图像混合
1. 访问图像中像素的三种方式 任何图像处理算法,都是从操作每个像素开始的.在OpenCV中,提供了三种访问每个像素的方法. 方法1:指针访问:C操作符[] 方法2:迭代器iterator 方法3:动 ...
最新文章
- 我就不信看完这篇你还搞不懂信息熵
- 【LeetCode】two num 利用comparable接口 对对象进行排序
- 最深刻最通俗的HTTPS 原理详解,图文并茂
- SEO三种职位类型:编辑型SEO、技术型SEO、营销型SEO详解
- 3800元!爆料大神怒赞谷歌Pixel 6:这是今年最好看手机!
- Android USB Audio accessory设备
- net core上传文件异常:Multipart body length limit 16384 exceeded.
- 算法:回溯七 Permutation Sequence数组全排列定位
- javascript 实现下载的几种方法
- Java常用算法手册-01算法概述
- 02333软件工程要点及考点
- Htmlcssjs 图片轮播,加箭头
- 中文论文网站、英文论文网站、专业领域论文网站(学术狗必备的21个论文网站)
- 上传大文件报错413问题处理
- HTTP 的前世今生
- 【SQL面试】WHERE 1=1 到底是啥意思?
- 虚拟机防火墙关了怎么端口还是不能访问
- 时光机与流浪者-我的2017
- 自己动手爬取免费代理IP
- 软件测试学习教程(一)-学习路线图
热门文章
- 计算机机房建设公司 武汉,武汉信息化机房建设企业
- 2020 快手 被吊打面经
- JAVA设计模式之模板方法模式-场景、例子、深入
- Logistic Regression分类器与softmax分类器
- 使用LaTeX给PDF加背景
- 使用Caronte在CTF比赛中完成网络流量分析
- 680.验证回文字符串(力扣leetcode) 博主可答疑该问题
- 编译exe不弹窗口_详解matlab mbuild -setup找不到C++编译器解决方案
- linux 桌面共享xfce,漂亮而且轻量级的桌面-----xfce安装
- TCP和HTTP的区别和联系