三种对象注入的区别以及@Autowired和@Resource的区别

news2024/11/20 0:45:08

文章目录

  • 1. 对象注入
    • 1.2 属性注入
      • 1.2.1 属性注入的优缺点
    • 1.3 Setter方法注入
      • 1.3.1 Setter注入的优缺点
    • 1.4 构造方法注入(官方推荐)
      • 1.4.1 构造方法的优缺点
    • 1.5 @Resource与@Autowired区别

1. 对象注入

获取Bean对象也称为对象注入/对象装配,表示把某个对象从Spring容器中取出来给某个类。

对象注入的方法有三种:

  1. 属性注入
  2. Setter注入
  3. 构造方法注入

1.2 属性注入

属性注入是用一个叫@Autowired注解实现的,当spring运行时,会将实现@Autowired注解的属性自动获取一个对象。

下述代码展示:将Service类注入到Controller类中。

  • Service代码:
import org.springframework.stereotype.Service;

@Service
public class UserService {
	 /**
     *     注意:此处是伪代码,用来代替数据库 实际中是不用new对象的
     * @param id 根据Id获取用户信息
     * @return 返回一个对象存储到Spring容器中
     */
    public User getUser(Integer id){
        User user = new User();
        user.setName("lisi");
        user.setAge(18);
        user.setId(1);
        return user;
    }
}
  • Controller代码:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class UserController {
	//使用注解 自动获取spring容器中的Bean对象/对象注入
    @Autowired
    private UserService userService;
    
    public User getUser(Integer id){
        return userService.getUser(id);
    }
}

在Controller类中使用@Autowired注解时,对象引用名建议首字母小写,合规;因为在获取对象时是按照UserService这个类搜索,再按照userService这个名字获取的,这个命名规则是spring规定的;

  • 测试是否拿到了Service类:成功拿到了
public class App {
    public static void main(String[] args) {
        //1.得到spring
        ApplicationContext context =
                 new ClassPathXmlApplicationContext("spring-config.xml");
        //2.获得bean
        UserController userController  = context.getBean("userController",UserController.class);
        //验证是否获取到Bean对象
        System.out.println(userController.getUser(1).toString());
    }
}

image-20231015151929717

1.2.1 属性注入的优缺点

优点:简单粗暴

缺点:

  1. 没办法实现final修饰的变量注入。
  2. 兼容性差,只适用于IoC容器
  3. 由于使用简单,更容易违反单一设计原则(单一设计原则:一个类一个功能)

1.3 Setter方法注入

Service类代码和测试类代码不变,变更Controller代码:

@Controller
public class UserController {

    private UserService userService;

    /*
    	在set方法上添加@Autowired注解,spring容器会自动把Bean对象传过来
    */
    @Autowired
    public void setUserService(UserService userService){
        this.userService = userService;
    }
    public User getUser(Integer id){
        return userService.getUser(id);
    }
}

  • 调用测试类验证:

image-20231015153304669

1.3.1 Setter注入的优缺点

优点:由于set方法只会传入一个参数,所以更符合单一设计原则

缺点:

  1. 不能注入final不可变对象
  2. 使用Setter注入的对象可能会被修改;因为在set方法进行注入后,可以在任何地方new一个UserController对象调用setUserService修改userService的引用。

1.4 构造方法注入(官方推荐)

Service类代码和测试类代码不变,变更Controller代码:

@Controller
public class UserController {

    private UserService userService;
    /*
        当只有一个构造方法时,可以省略@Autowired
        一样可以完成对象注入
     */
    public UserController(UserService userService) {
        this.userService = userService;
    }
}

当只有一个构造方法时,可以省略@Autowired,但是有多个构造方法时不能省略@Autowired。

  • 调用测试类:

image-20231015153308557

为什么构造方法可以省略注解?那是因为这是官方推荐的,自然要大力支持啦。就好像HashMap与HashTable,HashMap可以允许key-value是null,但是HashTable就不能,因为HashTable底层可能是数组加链表实现的,需要根据key值来计算位置的,HashMap源码中写了null值的处理,为null转换成0,而HashTable并没有进行特别处理,只能报错。

1.4.1 构造方法的优缺点

优点:

  1. 可以注入final不可变对象(因为被final修饰的对象的初始化要么在定义时进行赋值,要么在构造方法中赋值
  2. 注入的对象不会被改变(构造方法只能执行一次)
  3. 构造方法可以保证注入的对象完全被初始化(在类加载的初始化阶段就会执行构造方法,之后再把类注入到spring容器中)
  4. 兼容性好(构造方法是所有框架都支持的)

缺点:无

1.5 @Resource与@Autowired区别

使用@Resource注解进行对象注入,可以看到@Resource注解不能用于构造方法上。

image-20231015154655929

  • 使用@Resource注解成功获取对象:

image-20231015154803778

@Resource与@Autowired区别:

  1. @Resource是来自JDK,@Autowired来自spring官方

  2. @Resource的注入能力弱于@Autowired,只能用于属性注入和set方法注入,@Autowired可以用于属性注入、set方法注入以及构造方法注入

  3. @Resource提供的参数更多,@Autowired只有一个required参数,这就导致如果同一个类

    被注入多个到spring容器中,使用@Autowired就不行,使用@Resource的来设置name属性。

  • @Resource提供的参数:

image-20231015155451022

  • @Autowired提供的参数:

,@Autowired只有一个required参数,这就导致如果同一个类

被注入多个到spring容器中,使用@Autowired就不行,使用@Resource的来设置name属性。

  • @Resource提供的参数:

在这里插入图片描述

  • @Autowired提供的参数:

image-20231015155533146

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1094912.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux:Termius连接本地虚拟机与虚拟机快照

Termius连接本地虚拟机与虚拟机快照 1. Termius连接本地虚拟机2. 虚拟机快照与还原2.1 设置快照以及恢复 附录 1. Termius连接本地虚拟机 ifconfig -a 查看配置 连接成功 2. 虚拟机快照与还原 在学习阶段我们无法避免的可能损坏Linux操作系统。 如果损坏的话,重新…

FPGA复习(功耗)

减小功耗 就得减小电流 电流和CF有关( C: 电容(被门数目和布线长度影响) F:时钟频率) 方法大纲 减小功耗:1 时钟控制 2输入控制 3减小供电电压 4双沿触发器 5修改终端 同步数字电路降低动态功耗:动态禁止…

零食百货经营商城小程序的作用是什么

零食可以只指某款单品,也可以是一堆各品牌食品,其行业涵盖人群广泛,主要以零售和批发为主,不受限制,各地从业商家也非常多,但随着线上电商崛起,零食经营痛点也逐渐凸显。 通过【雨科】平台搭建零…

Elasticsearch实现检索词自动补全(检索词补全,自动纠错,拼音补全,繁简转换) 包含demo

Elasticsearch实现检索词自动补全 自动补全定义映射字段建立索引测试自动补全 自动纠错查询语句查询结果 拼音补全与繁简转换安装 elasticsearch-analysis-pinyin 插件定义索引与映射建立拼音自动补全索引测试拼音自动补全测试繁简转换自动补全 代码实现demo结构demo获取 自动补…

C# 图解教程 第5版 —— 第5章 类的基本概念

文章目录 5.1 类的概述5.2 程序和类:一个简单的示例(*)5.3 声明类(*)5.4 类成员(*)5.4.1 字段(*)5.4.2 方法 5.5 创建变量和类的实例(*)5.6 为数据…

解析找不到msvcp140.dll的5个解决方法,快速修复dll丢失问题

​在使用计算机过程中,我们也会遇到各种各样的问题。其中,找不到msvcp140.dll修复方法是一个非常普遍的问题。msvcp140.dll是一个动态链接库文件,它是Microsoft Visual C 2015 Redistributable的一部分。这个文件包含了许多用于运行C程序的函…

计算机网络基础(三):IPv4编址方式、子网划分、IPv4通信的建立与验证及ICMP协议

**IPv4地址是一个32位长的二进制数。**而这个32位二进制数又通常会表示为4个用点隔开的十进制数。那么,这个32位二进制数要如何通过4个十进制数表示出来呢? 我们在配置IPv4地址时,同时配置的“掩码”又有何用途? 1.IPv4编址方式…

MySQL 约束,视图,索引及常见函数

​​​​​​ ​​​​​​​ 2-MySQL 约束,视图,索引及常见函 1 SQL约束 SQL 约束用于规定表中的数据规则。实际上就是表中数据的限制条件。是为了保证数据的完整性而实现的一套机制。 MySQL的约束种类如下: 非空约束:NOT NULL NOT NULL约束强制…

汉堡炸鸡快餐店商城小程序的作用是什么

汉堡炸鸡等快餐店是不少年轻人常去的餐饮店,市场中除了头部品牌外,还有不少中小品牌,消费者选择度高,然而在实际经营中,面对线下流量匮乏、互联网电商发展,快餐店经营痛点不少。 对炸鸡汉堡店来说&#xf…

全球产业链:脑机接口产业链

本心、输入输出、结果 文章目录 全球产业链:脑机接口产业链前言马斯克旗下的脑机接口公司`Neuralink`宣布概念:什么是脑机接口脑机接口技术有哪几种路线脑机接口未来在各行业的应用脑机接口产业链上游脑机接口芯片脑电采集设备系统软件手术耗材脑机接口产业链中游脑机接口产业…

扩散模型的系统性学习(一):DDPM的学习

文章目录 一、学习的资料1.1 对于扩散模型的发展过程的综述1.2对论文中涉及的公式以及公式对应的代码的解读1.3github中对于各模型实现的代码1.4相关基础知识的学习 二、DDPM的学习2.1 DDPM总体知识的梳理2.2相关代码的解读2.2.1unet 代码块2.2.2高斯扩散代码块2.2.3 实验流程代…

【环境搭建】linux docker-compose安装seata1.6.1,使用nacos注册、db模式

新建目录,挂载用 mkdir -p /data/docker/seata/resources mkdir -p /data/docker/seata/logs 给权限 chmod -R 777 /data/docker/seata 先在/data/docker/seata目录编写一个使用file启动的docker-compose.yml文件(seata包目录的script文件夹有&#…

常见的网络攻击手段

网络攻击对个人、组织和整个社会都带来了严重的威胁,因此必须采取有效的安全措施来保护网络系统和用户的信息安全。网站是攻击者经常瞄准的目标,以下是一些常见的攻击方式: 1. DDoS攻击(分布式拒绝服务攻击)&#xff1…

Unity引擎:收费模式和服务升级,为游戏开发带来更多可能性

Unity 引擎的收费模式和配套服务升级已经引起了广泛的关注和讨论。自 2024 年 1 月 1 日起,Unity 将根据游戏的安装量对开发者进行收费。这将会影响到很多游戏开发者和玩家。本文将探讨 Unity 引擎的收费模式和配套服务更新,以及对游戏开发者和玩家的影响…

数据结构 - 6(优先级队列(堆)13000字详解)

一:堆 1.1 堆的基本概念 堆分为两种:大堆和小堆。它们之间的区别在于元素在堆中的排列顺序和访问方式。 大堆(Max Heap): 在大堆中,父节点的值比它的子节点的值要大。也就是说,堆的根节点是堆…

四川竹哲电子商务有限公司怎么样?可靠吗?

随着抖音等短视频平台的火热发展,越来越多的人开始关注如何在抖音上获得更多的关注和粉丝。而四川竹哲电子商务有限公司作为一家专业的抖音培训服务公司,正是帮助这些人实现梦想的地方。 首先,四川竹哲电子商务有限公司的抖音培训服务有着丰…

【软考】14.1 面向对象基本概念/分析设计测试

《面向对象开发》 对象 现实生活中实际存在的一个实体;构成系统的一个基本单位由对象名、属性和方法组成 类 实体的形式化描述;对象是类的实例,类是对象的模板可分为:实体类:现实世界中真实的实体接口类(边…

msvcp120.dll丢失的解决方法总结,快速解决dll丢失问题

在计算机系统中,DLL(动态链接库)是一个重要的组成部分,它负责程序之间的相互调用和数据共享。然而,有时候我们可能会遇到“MSVCP120.dll丢失”的问题,这可能会导致一些应用程序无法正常运行。本文将详细介绍…

Netty P1 NIO 基础,网络编程

Netty P1 NIO 基础,网络编程 教程地址:https://www.bilibili.com/video/BV1py4y1E7oA https://nyimac.gitee.io/2021/04/25/Netty%E5%9F%BA%E7%A1%80/ 1. 三大组件 1.1 Channel & Buffer Channel 类似 Stream,它是读写数据的双向通道…

RSA加密与解密原理

目录 一、什么是RSA加密 二、RSA加密原理 三、RSA加解密过程与算法代码 一、什么是RSA加密 RSA加密是一种非对称加密算法。 对称加密: 对称加密是一种加密方式,加密和解密使用同一个密钥,被加密的信息在传输前用预先协商好的密钥进行加密…