码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Spring的三种注入方式(为什么推荐构造器注入?)


    Spring的三种注入方式

    一、属性注入

    @Resource和@Autowired的区别

    为什么尽量使用 @Resource? 

    二、setter 注入 

    三、构造器注入

    具体可以看看Spring官网

    为什么构造器注入不需要 @Autowired 或 @Resource 注解?


    Spring的三种注入方式

    Spring有三种注入方式,分别是——属性注入、setter 注入、构造器注入 

    7971ef9e92bdc2e6d166e3525b35babf.png

    一、属性注入

    这种方式是最常用的,我们可以使用 @Autowired 或者是 @Resource 进行注入

    1. @RestController
    2. @RequestMapping("/shop")
    3. public class ShopController {
    4. @Resource
    5. public IShopService shopService;
    6. /**
    7. * 根据id查询商铺信息
    8. * @param id 商铺id
    9. * @return 商铺详情数据
    10. */
    11. @GetMapping("/{id}")
    12. public Result queryShopById(@PathVariable("id") Long id) {
    13. //return Result.ok(shopService.getById(id));
    14. return shopService.queryById(id);
    15. }
    16. }

    使用方式是最简单,但是也是最不推荐的!要使用也是推荐使用 @Resource!

    @Resource和@Autowired的区别

    为什么尽量使用 @Resource? 

    看看我写的这一篇文章!!! 

    @Autowired 和 @Resource 的区别(为什么更推荐使用@Resource ?)_面向鸿蒙编程的博客-CSDN博客@Autowired和@Resource注解的区别,趣头条面试官:@Resource和@Autowired有啥区别?,@Autowired 和 @Resource 的区别,【Java面试】面试被问:ConcurrentHashMap 底层实现原理?(3)如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常。,找到之后把具体的值赋值到userDao中去(但是如果找到多个的话,会报错!https://blog.csdn.net/weixin_43715214/article/details/127858049

    二、setter 注入 

    这种方法是 Spring3.X 版本比较推荐的,但是我基本上没有见到有人用过!

    1. @Controller
    2. public class DemoController {
    3. private DemoService demoService;
    4. @Autowired
    5. public void setDemoService(DemoService demoService) {
    6. this.demoService = demoService;
    7. }
    8. }

    用法大概就像上面的那样,在 set方法 上面加上注解即可。 

    三、构造器注入

    这就是目前 Spring 最为推荐的注入方式,直接通过带参构造方法来注入。

    这种方式我有在项目中有看到有人用过,但是也不是很多。

    1. // 部分代码
    2. @Component
    3. public class RedisIdWorker {
    4. private StringRedisTemplate stringRedisTemplate;
    5. public RedisIdWorker(StringRedisTemplate stringRedisTemplate) {
    6. this.stringRedisTemplate = stringRedisTemplate;
    7. }
    8. }

    关于构造器注入Spring在文档里是这么说的

    The Spring team generally advocates constructor injection as it enables one to implement application components as immutable 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.


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

    单一职责: 当使用构造函数注入的时候,你会很容易发现参数是否过多,这个时候需要考虑你这个类的职责是否过大,考虑拆分的问题;而当使用@Autowired注入field的时候,不容易发现问题

    依赖不可变: 只有使用构造函数注入才能注入final

    依赖隐藏:使用依赖注入容器意味着类不再对依赖对象负责,获取依赖对象的职责就从类抽离出来,IOC容器会帮你自动装备。这意味着它应该使用更明确清晰的公用接口方法或者构造器,这种方式就能很清晰的知道类需要什么和到底是使用setter还是构造器

    降低容器耦合度: 依赖注入框架的核心思想之一是托管类不应依赖于所使用的DI容器。换句话说,它应该只是一个普通的POJO,只要您将其传递给所有必需的依赖项,就可以独立地实例化。这样,您可以在单元测试中实例化它,而无需启动IOC容器并单独进行测试(使用一个可以进行集成测试的容器)。如果没有容器耦合,则可以将该类用作托管或非托管类,甚至可以切换到新的DI框架。

    具体可以看看Spring官网

    Setter injection versus constructor injection and the use of @Required (spring.io)https://spring.io/blog/2007/07/11/setter-injection-versus-constructor-injection-and-the-use-of-required/Field Dependency Injection Considered Harmful | Vojtech Ruzicka's Programming Bloghttps://www.vojtechruzicka.com/field-dependency-injection-considered-harmful/

    为什么构造器注入不需要 @Autowired 或 @Resource 注解?

    这是 Spring 框架自身的一个特性,对于一个 SpringBean 来说,如果其只有一个构造方法,那么 Spring 会使用该构造方法并自动注入其所需要的全部依赖!

    为什么 Spring 的构造器注入不需要 @Autowired 注解?_面向鸿蒙编程的博客-CSDN博客icon-default.png?t=M85Bhttps://blog.csdn.net/weixin_43715214/article/details/127848186

  • 相关阅读:
    H5 的浏览器存储
    C++中的继承
    89.(cesium之家)cesium聚合图(自定义图片)
    中小企业成本的会计核算方法
    深度理解事件流和DOM事件流的工作原理
    沟通和礼仪
    SpringBoot打成jar运行后无法读取resources里的文件
    【博客435】Kubernetes集群中,Node异常时Pod状态分析
    java学习第185天,javaWeb学习第44天,复习第20天;p248-249(08/18)-2.5h
    教育部:每所学校贷款项目总投资原则上不低于2000万
  • 原文地址:https://blog.csdn.net/weixin_43715214/article/details/127853692
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号