iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Spring为什么不推荐使用@Autowired注解详析
  • 493
分享到

Spring为什么不推荐使用@Autowired注解详析

2024-04-02 19:04:59 493人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录引言 spring的三种注入方式 属性(filed)注入 构造器注入 set方法注入 属性注入可能出现的问题 问题一 问题二 问题三 spring建议使用@Resource代替@

引言

使用idea开发时,同组小伙伴都喜欢用@Autowired注入,代码一片warning,看着很不舒服,@Autowired作为Spring的亲儿子,为啥在IDEA中提示了一个警告:Field injection is not recommended

想搞清楚这个问题之前,首先先了解一下依赖注入的几种方式

Spring的三种注入方式

属性(filed)注入

这种注入方式就是在bean的变量上使用注解进行依赖注入。本质上是通过反射的方式直接注入到field。这是我平常开发中看的最多也是最熟悉的一种方式。


@Autowired 
UserDao userDao;

构造器注入

将各个必需的依赖全部放在带有注解构造方法的参数中,并在构造方法中完成对应变量的初始化,这种方式,就是基于构造方法的注入。比如:


final
UserDao userDao;

@Autowired
public UserServiceImpl(UserDao userDao) {
    this.userDao = userDao;
}

set方法注入

通过对应变量的setXXX()方法以及在方法上面使用注解,来完成依赖注入。比如:


private UserDao userDao;

@Autowired
public void setUserDao (UserDao userDao) {
    this.userDao = userDao;
}

属性注入可能出现的问题

问题一

基于 field 的注入可能会带来一些隐含的问题。来我们举个例子:


@Autowired
private User user;

private String company;

public UserDaoImpl(){
    this.company = user.getCompany();
}

编译过程不会报错,但是运行之后报NullPointerException

Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [...]: Constructor threw exception; nested exception is java.lang.NullPointerException

Java 在初始化一个类时,是按照静态变量或静态语句块 –> 实例变量或初始化语句块 –> 构造方法 -> @Autowired 的顺序。所以在执行这个类的构造方法时,user对象尚未被注入,它的值还是 null。

问题二

不能有效的指明依赖。相信很多人都遇见过一个bug,依赖注入的对象为null,在启动依赖容器时遇到这个问题都是配置的依赖注入少了一个注解什么的。这种方式就过于依赖注入容器了,当没有启动整个依赖容器时,这个类就不能运转,在反射时无法提供这个类需要的依赖。

问题三

依赖注入的核心思想之一就是被容器管理的类不应该依赖被容器管理的依赖,换成白话来说就是如果这个类使用了依赖注入的类,那么这个类摆脱了这几个依赖必须也能正常运行。然而使用变量注入的方式是不能保证这点的。

spring建议

Since you can mix constructor-based and setter-based DI, it is a Good rule of thumb to use constructors for mandatory dependencies and setter methods or configuration methods for optional dependencies.

翻译过来就是:

强制依赖就用构造器方式
可选、可变的依赖就用setter注入

使用@Resource代替@Autowired

@Resource有2个属性name和type。在spring中name属性定义为bean的名字,type这是bean的类型。如果属性上加@Resource注解那么他的注入流程是

  • 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
  • 如果指定了name,则从上下文中查找名称匹配的bean进行装配,找不到则抛出异常。
  • 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
  • 如果既没有指定name,又没有指定type,则默认按照byName方式进行装配;如果没有匹配,按照byType进行装配。

@Autowired只根据type进行注入,不会去匹配name。如果涉及到type无法辨别注入对象时,那需要依赖@Qualifier或@Primary注解一起来修饰。

使用@RequiredArgsConstructor构造器方式注入

这种形式就是Spring推荐使用的构造器方式注入,此种方式是lombok包下的注解,如果使用此种方式,需要项目中引入lombok,例如:


@RequiredArgsConstructor
public class UserDaoImpl{
	private final User user;
}

总结

到此这篇关于Spring为什么不推荐使用@Autowired注解的文章就介绍到这了,更多相关Spring使用@Autowired注解内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Spring为什么不推荐使用@Autowired注解详析

本文链接: https://www.lsjlt.com/news/156311.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring为什么不推荐使用@Autowired注解详析
    目录引言 Spring的三种注入方式 属性(filed)注入 构造器注入 set方法注入 属性注入可能出现的问题 问题一 问题二 问题三 spring建议使用@Resource代替@...
    99+
    2024-04-02
  • 为什么Spring和IDEA都不推荐使用@Autowired注解
    目录前言Spring为什么不推荐使用@Autowired 注解背景原因解决思考@Autowired, @Qualifier, @Resource, 三者有何区别参考文档前言 请看下面...
    99+
    2024-04-02
  • Spring和IDEA为什么都不推荐使用@Autowired注解
    今天小编给大家分享一下Spring和IDEA为什么都不推荐使用@Autowired注解的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2023-06-29
  • 解析Idea为什么不推荐使用@Autowired进行Field注入
    目录Spring常见的DI方式@Autowired VS @Resource各种DI方式的优缺点Field注入的缺点为什么IDEA只对@Autowired警告大家在使用IDEA开发的...
    99+
    2024-04-02
  • 为什么不推荐使用C++
    这篇文章主要讲解了“为什么不推荐使用C++”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“为什么不推荐使用C++”吧!(1) C++语法很复杂,好的C++程序员难求。语法上 C++14 开始的...
    99+
    2023-06-16
  • 为什么java不推荐使用vector
    从网上各处搜集的知识整理出来1.因为vector是线程安全的,所以效率低,这容易理解,类似StringBuffer2.Vector空间满了之后,扩容是一倍,而ArrayList仅仅是一半3.Vector分配内存的时候需要连续的存储空间,如果...
    99+
    2023-06-03
  • Vue中为什么不推荐用index做key详解
    目录前言diff算法key的作用通过 key 管理状态效率 & Bug总结前言 尤大在vue 2.x的文档中明确指出:建议尽可能在使用 v-for 时提供...
    99+
    2024-04-02
  • react为什么不推荐使用index作为key
    1.旧的虚拟dom和新的虚拟dom对比,首先看他们的key是否相同 2.相同继续对比他们的内容,不同生成新的真实dom进行替换 3.如果内容和key都相同,复用旧的真实dom 不做改...
    99+
    2024-04-02
  • Spring中Transactional注解使用的心得(推荐)
    事务特性 @Transactional注解是用于事务控制的,需要知道事务的ACID特征:即原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Is...
    99+
    2022-11-13
    Spring Transactional注解 Spring Transactional使用
  • 详解Spring bean的注解注入之@Autowired的原理及使用
    一、@Autowired 概念: @Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 通过 @Autowired的使用来消除 set ,ge...
    99+
    2024-04-02
  • Java中数组的使用与注意事项详解(推荐)
    目录一.初始数组二.数组的创建三.使用数组时的注意事项(1)初始化问题(2)数组长度的使用(3)有关数组长度的问题(4)对于数组的访问(5)数组的遍历三.数组的类型1、每个部分数据区...
    99+
    2024-04-02
  • Vue 中为什么不推荐用index 做 key属性值
    目录前言key 的作用key 在 diff 算法中的角色同步头部节点同步尾部节点添加新的节点删除多余节点最长递增子序列为什么不要用 index性能消耗数据错位解决方案总结前言 前端开...
    99+
    2024-04-02
  • 详解Spring @Profile注解的使用和源码解析
    目录介绍使用通过Environment设置profile通过JVM参数设置SpringBoot通过yml进行配置源码解析BeanDefinition注册shouldSkip源码Pro...
    99+
    2023-05-15
    Spring @Profile注解使用 Spring @Profile注解 Spring @Profile
  • 游戏行业为什么推荐使用高防服务器
    游戏行业推荐使用高防服务器的原因有:1.攻击频繁,高防服务器可以抵御恶意的DDoS和CC攻击;2.缺乏服务能力,高防服务器稳定性好,可以应付大流量攻击;3.竞争激烈,高防服务器可以提供安全的网络运行环境,避免黑客入侵;具体分析如下:攻击频繁...
    99+
    2024-04-02
  • MySql主键id不推荐使用UUID的原因是什么
    本文小编为大家详细介绍“MySql主键id不推荐使用UUID的原因是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“MySql主键id不推荐使用UUID的原因是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
    99+
    2023-07-05
  • 【微服务】Spring条件注解从使用到源码分析详解
    文章目录 什么是Spring条件注解?如何使用Spring条件注解1. `@ConditionalOnClass`2. `@ConditionalOnProperty`3. `@Conditi...
    99+
    2023-10-22
    微服务 spring 架构 原力计划
  • 【微服务】spring 条件注解从使用到源码分析详解
    目录 一、前言 二、spring 条件注解概述 2.1 条件注解@Conditional介绍 2.2 @Conditional扩展注解 来源地址:https://blog.csdn.net/zhangcongyi420/article/de...
    99+
    2023-08-31
    springboot条件注解 spring条件注解使用 spring条件注解
  • Spring @Bean注解的使用场景是什么
    本篇内容介绍了“Spring @Bean注解的使用场景是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、简单介绍翻看Spri...
    99+
    2023-07-05
  • 详解Python为什么不用设计模式
    前言 刚刚看了EuroPython 2017一篇演讲,Why You Don't Need Design Patterns in Python,为什么python不用设计模式。演讲者...
    99+
    2024-04-02
  • 怎么使用Spring提供的不同缓存注解实现缓存
    这篇文章主要介绍了怎么使用Spring提供的不同缓存注解实现缓存的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用Spring提供的不同缓存注解实现缓存文章都会有所收获,下面我们一起来看看吧。前言缓存可以通...
    99+
    2023-07-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作