广告
返回顶部
首页 > 资讯 > 后端开发 > Python >spring中@Autowire和@Resource的区别在哪里(推荐)
  • 659
分享到

spring中@Autowire和@Resource的区别在哪里(推荐)

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

摘要

目录介绍注入方式基于构造函数的依赖注入基于Setter的依赖注入基于字段的依赖注入基于字段的依赖注入缺点对于有final修饰的变量不好使掩盖单一职责的设计思想与spring的ioc机

介绍

今天使用idea写代码的时候,看到之前的项目中显示有warning的提示,去看了下,是如下代码?

@Autowire
private JdbcTemplate jdbcTemplate;

提示的警告信息

Field injection is not recommended Inspection info: Spring Team recommends: "Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies".

这段是Spring工作组的建议,大致翻译一下:

属性字段注入的方式不推荐,检查到的问题是:Spring团队建议:"始终在bean中使用基于构造函数的依赖项注入,始终对强制性依赖项使用断言"

如图

注入方式

虽然当前有关Spring Framework(5.0.3)的文档仅定义了两种主要的注入类型,但实际上有三种:

基于构造函数的依赖注入

public class UserServiceImpl implents UserService{
    private UserDao userDao;
    
    @Autowire
    public UserServiceImpl(UserDao userDao){
        this.userDao = userDao;
    }
}

基于Setter的依赖注入

public class UserServiceImpl implents UserService{
     private UserDao userDao;
     
     @Autowire
     public serUserDao(UserDao userDao){
         this.userDao = userDao;
     }
 }

基于字段的依赖注入

public class UserServiceImpl implents UserService{
     @Autowire
     private UserDao userDao;
 }

基于字段的依赖注入方式会在Idea当中吃到黄牌警告,但是这种使用方式使用的也最广泛,因为简洁方便.您甚至可以在一些Spring指南中看到这种注入方法,尽管在文档中不建议这样做.(有点执法犯法的感觉)

如图

基于字段的依赖注入缺点

对于有final修饰的变量不好使

Spring的IOC对待属性的注入使用的是set形式,但是final类型的变量在调用class的构造函数的这个过程当中就得初始化完成,这个是基于字段的依赖注入做不到的地方.只能使用基于构造函数的依赖注入的方式

掩盖单一职责的设计思想

我们都知道在OOP的设计当中有一个单一职责思想,如果你采用的是基于构造函数的依赖注入的方式来使用Spring的IOC的时候,当你注入的太多的时候,这个构造方法的参数就会很庞大,类似于下面.

当你看到这个类的构造方法那么多参数的时候,你自然而然的会想一下:这个类是不是违反了单一职责思想?.但是使用基于字段的依赖注入不会让你察觉,你会很沉浸在@Autowire当中

publicclassVerifyServiceImplimplentsVerifyService{    private AccountService accountService;private UserService userService;private IDService idService;private RoleService roleService;private PermissionService permissionService;private EnterpriseService enterpriseService;private EmployeeService employService;private TaskService taskService;private RedisService redisService;private MQService mqService;public SystemLogDto(AccountService accountService,                       UserService userService,                       IDService idService,                       RoleService roleService,                       PermissionService permissionService,                       EnterpriseService enterpriseService,                       EmployeeService employService,                       TaskService taskService,                       RedisService redisService,                       MQService mqService) {this.accountService = accountService;this.userService = userService;this.idService = idService;this.roleService = roleService;this.permissionService = permissionService;this.enterpriseService = enterpriseService;this.employService = employService;this.taskService = taskService;this.redisService = redisService;this.mqService = mqService;  }}

与Spring的IOC机制紧密耦合

当你使用基于字段的依赖注入方式的时候,确实可以省略构造方法和setter这些个模板类型的方法,但是,你把控制权全给Spring的IOC了,别的类想重新设置下你的某个注入属性,没法处理(当然反射可以做到).

本身Spring的目的就是解藕和依赖反转,结果通过再次与类注入器(在本例中为Spring)耦合,失去了通过自动装配类字段而实现的对类的解耦,从而使类在Spring容器之外无效.

隐藏依赖性

当你使用Spring的IOC的时候,被注入的类应当使用一些public类型(构造方法,和setter类型方法)的方法来向外界表达:我需要什么依赖.但是基于字段的依赖注入的方式,基本都是private形式的,private把属性都给封印到class当中了.

无法对注入的属性进行安检

基于字段的依赖注入方式,你在程序启动的时候无法拿到这个类,只有在真正的业务使用的时候才会拿到,一般情况下,这个注入的都是非null的,万一要是null怎么办,在业务处理的时候错误才爆出来,时间有点晚了,如果在启动的时候就暴露出来,那么bug就可以很快得到修复(当然你可以加注解校验).

如果你想在属性注入的时候,想根据这个注入的对象操作点东西,你无法办到.我碰到过的例子:一些配置信息啊,有些人总是会配错误,等到了自己测试业务阶段才知道配错了,例如线程初始个数不小心配置成了3000,机器真的是狂叫啊!这个时候就需要再某些Value注入的时候做一个检测机制.

结论

通过上面,我们可以看到,基于字段的依赖注入方式有很多缺点,我们应当避免使用基于字段的依赖注入.推荐的方法是使用基于构造函数和基于setter的依赖注入.对于必需的依赖项,建议使用基于构造函数的注入,以使它们成为不可变的,并防止它们为null。对于可选的依赖项,建议使用基于Setter的注入

到此这篇关于spring中@Autowire和@Resource的区别在哪里?的文章就介绍到这了,更多相关spring中@Autowire和@Resource的区别内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: spring中@Autowire和@Resource的区别在哪里(推荐)

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

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

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

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

下载Word文档
猜你喜欢
  • spring中@Autowire和@Resource的区别在哪里(推荐)
    目录介绍注入方式基于构造函数的依赖注入基于Setter的依赖注入基于字段的依赖注入基于字段的依赖注入缺点对于有final修饰的变量不好使掩盖单一职责的设计思想与Spring的IOC机...
    99+
    2023-02-17
    spring中@Autowire和@Resource的区别 @Autowire和@Resource的区别 spring中@Autowire和@Resource
  • 浅谈Spring框架中@Autowired和@Resource的区别
    目录前言默认注入方式不同提供者不同补充:@Resource的装配顺序如下总结前言 写过Spring框架的同学应该都知道,Spring当中使用字段注入的时候既可以用 @Autowire...
    99+
    2022-11-13
    @autowired和@resource区别 spring @autowired @resource
  • 一文搞懂Spring中@Autowired和@Resource的区别
    目录1.来源不同2.依赖查找顺序不同2.1 @Autowired 查找顺序2.2 @Resource 查找顺序2.3 查找顺序小结3.支持的参数不同4.依赖注入的支持不同5.编译器提...
    99+
    2022-11-13
  • Spring中@Autowired、@Resource和@Inject注解的区别是什么
    这篇文章主要介绍了Spring中@Autowired、@Resource和@Inject注解的区别是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Spring中@Autowired、@Resource和@I...
    99+
    2023-07-05
  • 角色resource在11g和12c中的区别
    前言     在11gR2环境中,假如用户同时被授予了connect和resource角色后,即可登录数据库创建对象。但是在12c中,如果用户只是被授予了这两个角色,可以创建对象,但是无法插入数据。 实验 ...
    99+
    2022-10-18
  • Spring拦截器和过滤器的区别在哪?
    目录一、概述二、拦截器和过滤器介绍2.1 过滤器 (Filter)2.2 拦截器 (Interceptor)2.3 主要区别三、拦截器和过滤器的区别3.1 实现原理不同3.2 使用范...
    99+
    2022-11-12
  • java 中Object与Objects的区别在哪里
    现在在从基础看起,巩固一下基础,在网上看到了很多解释,但是没有一语到位,按照自己的理解写一篇,方便自己之后查阅。 Object java.lang.Object java.la...
    99+
    2022-11-12
  • 在java中spring mvc和struts2的区别是什么
    Struts2是类级别的拦截机制,而Spring mvc是方法级别的拦截机制。Struts2有自己的拦截Interceptor机制,Spring mvc用的是独立的Aop方式。Struts2的配置文件量比Spring mvc大。Struts...
    99+
    2022-10-25
  • 私有ip和弹性ip的区别在哪里
    私有ip和弹性ip的区别在:弹性IP可以直接访问Internet的IP地址,而私有IP是公有云内网所使用的IP地址,用于内网通信,因此私有IP不能访问Internet;需要注意的是一个弹性IP只能给一个云服务器使用。地址对于一个房子而言只有...
    99+
    2022-10-12
  • 云服务器和空间的区别在哪里
    可用性:云服务器提供的是可用性(HA)功能,它可以在不需要用户干预的情况下将计算任务分配给多台云服务器上的计算机。如果需要,云服务器可以扩展其资源,以提高可用性。 可靠性:云服务器使用多个数据中心提供的资源,这些数据中心是由云服务提供商管...
    99+
    2023-10-28
    区别 服务器 空间
  • 云服务器和虚拟主机的区别和联系与区别在哪里
    云服务器(Cloud Server)是一种提供虚拟化服务器功能的云计算服务,它将计算资源分布于多个云计算服务提供商的资源池中,用户通过浏览器访问不同的服务提供商提供的虚拟化服务器,就像在本地硬件上运行一样。 虚拟主机(Virtual Se...
    99+
    2023-10-27
    区别 虚拟主机 服务器
  • Java中堆和栈的区别在哪
    一、分配释放方式不同 栈是为编译器自动分配和释放的,如函数参数、局部变量、临时变量等等。堆是为成员分配和释放的,由程序员自己申请、自己释放。 二、功能作用不同 从堆和栈的功能和作用来通俗的比较:  堆主要用来存放对象的。  栈主要是用来执行...
    99+
    2023-10-29
    区别 Java
  • 聊聊Numpy.array中[:]和[::]的区别在哪
    [:]和[::]的区别蛮大的,用的好可以节省时间,下面以实例进行分析 array([:]) >>> import numpy as np >>>...
    99+
    2022-11-12
  • 云服务器和虚拟机的区别在哪里
    云服务器和虚拟机(Virtual Cloud Desktop)是两种常见的虚拟技术,它们都是通过网络技术将服务器的计算和存储资源集合在一个虚拟空间中。它们的主要区别在于: 数据存储:云服务器提供了高速的数据存储和备份,而虚拟机只能存储数...
    99+
    2023-10-26
    虚拟机 区别 服务器
  • 云服务器和云主机的区别在哪里
    云服务器(Cloud Server)是一种通过互联网提供云服务的服务器,它通常是由多台高性能计算机和存储设备构成,可以通过网络共享存储、网络和其他资源。在云服务器上,用户可以使用多台计算机创建虚拟机,并将其分配给指定的应用程序,从而使应用程...
    99+
    2023-10-26
    区别 主机 服务器
  • 轻量云和云服务器的区别在哪里
    轻量云和云服务器之间有许多不同之处,但它们都是用于存储和处理数据的云存储架构。下面是它们的主要区别: 数据量:轻量云和云服务器通常具有大量的虚拟化资源,如计算、存储、网络和数据库等。因此,数据量可能非常大。 数据类型:轻量云和云服务器通...
    99+
    2023-10-26
    云和 区别 服务器
  • 服务器和云服务器的区别在哪里
    云服务器(Cloud Drive)是一种虚拟服务器,它可以通过互联网将计算机或其他终端连接到服务器上,从而使用户可以在同一平台上使用所有计算机或其他设备。与传统的服务器相比,云服务器具有以下几个主要特点: 快速响应能力:云服务器可以处理...
    99+
    2023-10-26
    服务器 区别
  • 虚拟机和云服务器的区别在哪里
    虚拟机是一种可以在虚拟机环境下运行的操作系统,它通常由操作系统、硬件设备和资源三个部分组成。操作系统负责管理计算机系统的各种资源,例如CPU、内存、磁盘空间等,而硬件设备则负责处理计算机上的各种操作。 云服务器则是一种通过云服务提供商的服...
    99+
    2023-10-28
    虚拟机 区别 服务器
  • 云服务器和数据库的区别在哪里
    云服务器和数据库都是常用的计算和存储平台,它们之间的区别在于以下几个方面: 运行方式和数据类型:云服务器是一个虚拟设备,不需要物理基础设施支持,因此可以运行任何操作系统,包括Windows和Linux,而数据库通常需要有物理基础设施支持...
    99+
    2023-10-26
    区别 服务器 数据库
  • 物理机和云服务器的区别在哪里
    物理机和云服务器是计算机和云存储服务的两种不同类型。下面是它们的主要区别: 访问:物理机是一种直接访问硬件设施的计算机系统。云服务器是一种通过互联网访问存储在服务器上的数据的方式。 管理:物理机通常只有一台服务器,用于处理数据。它们通常...
    99+
    2023-10-26
    区别 物理 服务器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作