• Home
  • 归档
文章检索 作品与友邻 关于我
暴君乔博客
Home 归档

spring推荐构造器注入,为什么?

发布于: 2020-11-26
更新于: 2023-07-09
文章目录
  1. spring注入方式
    1. field注入
    2. 构造器注入
    3. setter注入

spring注入方式

在代码开发中,是否老是被spring提示的,请使用构造器注入感到困惑和烦躁,为什么要使用构造器注入,而不能使用field注入or Setter注入呢

The Spring team generally advocates constructor injection as it enables one to implement application components asimmutable objects and to ensure that required dependencies are not null. Furthermore constructor-injected components are always returned to client (calling) code in a fully initialized state. As a side note, a large number of constructor arguments is a bad code smell, implying that the class likely has too many responsibilities and should be refactored to better address proper separation of concerns. ——–BY Spring

倡导构造器注入,因为它使得实现应用组件是作为一个不可变的对象,同时确保它所依赖的项目资源不是null的,此外构造器注入永远是返回调用者一个完全初始化的状态。温馨提示:庞大的构造器入参是坏味道代码,表明这个类有太多的职责,应该以更好的设计模式进行重构

field注入

// 这样子做确实挺简洁明了的,但是容易NPE,因为field injection在不调用时,没办法初始化,而当初始化往往都晚了
public class XXXService{
    @Autowired
    private XXXRepository repository;

    public void test(){
        repository.addSql();
    }
}
优点 对比 缺点
较为直观,清晰明了 相比构造器会出现NPE,循环依赖的情况,当不调用时也无法发现NPE的情况 其实主要也就是对比的内容了

构造器注入

现在强推的注入模式

@Autowired
public constructor(XXXService xxxService){
    this.xxx=xxxService;
}
优点 缺点
能做NPE检查,同时因为是构造器,所以避免了field注入时,需要用到才会初始化的情况 当变量巨多时会导致注入很臃肿,同时如果需要制定类注入时,这个方法不是那么好用了
主要是在初始化时想比setter注入,在类加载实例化时,一定能校验注入的内容不为空,更为安全

setter注入

旧一代spring推荐内容

优点 缺点
避免构造器臃肿庞大,同时可以使得类在之后配置或者重新注入,也能指定注入
spring推荐构造器注入,为什么?
/archives/672e3541/
作者
tyrantqiao
发布于
2020-11-26
更新于
2023-07-09
许可协议
CC BY-NC-SA 4.0
赏

蟹蟹大佬的打赏,大家一起进步

支付宝
微信
  • Java
  • Spring

扫一扫,分享到微信

微信分享二维码
left join与inner join的性能差异到底咋样
xunit读书笔记--01
© 2026 tyrantqiao 本站总访问量次 本站访客数人次 载入天数...载入时分秒...
  • 文章检索
  • 作品与友邻
  • 关于我

展开标签

  • 随笔
  • 旅行
  • Java
  • 面经
  • 源码
  • 架构
  • Hadoop
  • 计算机网络
  • 技术
  • IDEA
  • maven
  • JDK
  • Linux
  • MySQL
  • 性能
  • 数据库
  • Redis
  • MQ
  • Spring
  • SquirrelFin
  • 记账
  • Android
  • 个人财务
  • TIDB
  • unity
  • chatgpt
  • 前端
  • Vue
  • Git
  • shadowsocks
  • Hexo
  • 问题排查
  • 业务
  • JVM
  • 算法
  • nginx
  • ssh
  • Python
  • 爬虫
  • test
  • vim
  • 影视剧
  • 中间件
  • 事务
  • 表达
  • 运动
  • mybatis
  • 域名
  • AI
  • 产品
  • 家装
  • 土巴兔
  • github
  • 软件
  • 个人项目
  • Leaves
  • 幽默
  • 穿搭
  • 画画
  • 缓存
  • 摄影
  • 设计模式
  • c
  • 课程设计
  • 调酒
  • 数学

Collection

作品与友邻

我做的小工具、朋友的站点和一些长期值得回访的灵感来源。

  • 土 土巴兔 AI 导购交互演示 可点击体验用户导购、平台运营、装修公司、材料商及 AI 话术知识库的多端增长流程。 /demos/tubatu-ai-guide/
  • L Leaves 行程记录 我做的行程记录页面小工具,用来沉淀旅行路线、日程安排和途中的灵感。 https://leaves.tyrantqiao.com/
  • 本 本网站主题yilia设计者的主页 http://litten.me/
tyrantqiao的头像

tyrantqiao

github rss qq mail facebook linkedin

About

关于我

代码、海浪和持续折腾,都是生活的一部分。

<div class="aboutme-card"> <p class="aboutme-eyebrow">tyrantqiao</p> <h3>Java 全栈开发</h3> <p>常年和 Java、后端服务、前端工程、数据与部署打交道,喜欢把复杂问题拆开、写清楚,也把踩坑过程整理成文章留给后来的人。</p> <div class="aboutme-tags"> <span>Java</span> <span>Full Stack</span> <span>Backend</span> <span>Frontend</span> <span>Extreme Sports</span> </div> <p>工作之外偏爱冲浪等极限运动,享受在浪上找平衡,也享受在代码里找边界。</p> <div class="aboutme-contact"> <a href="mailto:[email protected]">Gmail</a> <a href="mailto:[email protected]">QQ Mail</a> </div> </div>