【Spring框架】spring对象注入的三种方法

news2024/11/18 7:51:30

目录

  • 1.属性注入
    • 问题:同类型的Bean存储到容器多个,获取时报错的问题;
      • 1.将属性的名字和Bean的名字对应上。
      • 2.使用@AutoWired+@Qualifier来筛选bean对象;
    • 属性注入优缺点
  • 2.Setter注入
    • Setter注入优缺点
  • 3.构造方法注入(Spring 4.x之后推荐注入方式)
    • 构造方法注入优缺点

1.属性注入

属性注⼊是使⽤ @Autowired 实现的,将 Service 类注⼊到 Controller 类中。

package com.java.demo.dao;

import org.springframework.stereotype.Repository;

@Repository
public class UserRepository {
    public int add() {
        System.out.println("Do UserRepository add method.");
        return 1;
    }
}

package com.java.demo.service;

import com.java.demo.dao.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    // 1. 属性注入
    @Autowired // DI(依赖注入)
    private UserRepository userRepository;

    public int add() {
        System.out.println("Do UserService add method.");
        // 传统写法
//        UserRepository userRepository = new UserRepository();
//        return userRepository.add();
        // Spring V1.0
//        ApplicationContext context =
//                new ClassPathXmlApplicationContext("spring-config.xml");
//        UserRepository userRepository = context.getBean("userRepository",UserRepository.class);
//
//        return userRepository.add();


        // Spring V2.0
        return userRepository.add();
    }
}

在这里插入图片描述

依赖注入 VS 依赖查找
-依赖查找依赖 Bean
-@Autowired 依赖注入流程:首先先根据getType(从容器中)获取对象,如果只获取一个,那么直接将此对象注入到当前属性上;如果获取到多个对象,才会使用getName(根据名称)进行匹配。

问题:同类型的Bean存储到容器多个,获取时报错的问题;

在这里插入图片描述
解决方案:

1.将属性的名字和Bean的名字对应上。

在这里插入图片描述
在这里插入图片描述

2.使用@AutoWired+@Qualifier来筛选bean对象;

在这里插入图片描述

属性注入优缺点

优点:使用简单。
缺点:
a)无法注入一个不可变的变量(final修饰的变量)
在这里插入图片描述
b)只适用于IoC容器。
c)更容易违背单一设计原则,因为使用起来比较简单。

2.Setter注入

package com.java.demo.service;

import com.java.demo.dao.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService3 {

    private UserRepository userRepository;

    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void sayHi() {
        System.out.println("Do UserService3 sayHi.");
        userRepository.add();
    }
}

在这里插入图片描述

Setter注入优缺点

优点:通常Setter只set一个属性,所以Setter注入更符合单一设计原则
缺点:
a)无法注入一个final修饰的变量;
b)Setter注入的对象可以被修改。Setter本生就是一个方法,既然是一个方法就有可能被多次调用和修改。

3.构造方法注入(Spring 4.x之后推荐注入方式)

package com.java.demo.service;

import com.java.demo.dao.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService4 {
    private UserRepository userRepository;

    @Autowired
    public UserService4(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void sayHi() {
        System.out.println("Do UserService4 sayHi.");
        userRepository.add();
    }

}

在这里插入图片描述
如果当前类中存在一个构造方法时,@Autowired可以省略。

构造方法注入优缺点

优点:
a)可以注入一个final修饰的变量。
b)注入的对象不会修改,因为构造方法只会加载一次。
c)构造方法注入可以保证注入对象完全初始化。
d)构造方法注入通用性更好。
缺点:
a)写法比属性注入复杂。
b)使用构造方法注入,无法解决循环依赖的问题。

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

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

相关文章

Node.js 安装与版本管理(nvm 的使用)

安装 Node.js Node.js 诞生于 2009 年 5 月,截至今天(2022 年 3 月 26 号)的最新版本为 16.14.2 LTS 和 17.8.0 Current,可以去官网下载合适的版本。 其中,LTS(Long Term Support) 是长期维护…

MySQL基础扎实——主键与候选键

词义解释 主键(Primary Key)和候选键(Candidate Key)是关系型数据库中的术语,用于标识和唯一确定表中的记录。它们之间有以下区别: 唯一性:主键是表中的唯一标识,每个表只能有一个主…

环境保护数据传输系统监测环境指标

嵌入式实时操作系统(RTOS)是一种专门设计用于嵌入式系统的操作系统。它具有实时性能和低延迟的特点,能够满足对时间响应性要求较高的应用。本文介绍了一种具备Modbus Slave和Modbus Master功能的嵌入式实时操作系统设备,以及其扩展…

OpenGL Metal Shader 编程:ShaderToy 内置全局变量

OpenGL & Metal Shader 编程:ShaderToy 内置全局变量 前面发了一些关于 Shader 编程的文章,有读者反馈太碎片化了,希望这里能整理出来一个系列,方便系统的学习一下 Shader 编程。 由于主流的 Shader 编程网站,如…

Dart - 语法糖(持续更新)

文章目录 前言开发环境中间表示语法糖1. 操作符/运算符(?./??/??/../?../.../...?)2. 循环(for-in)3. 函数/方法(>)4. 关键字(await for) 最后 前言 通过将dill文件序列化…

【时间序列预测 2023 ICLR】TimesNet

【时间序列预测 2023 ICLR】TimesNet 论文题目:TIMESNET: TEMPORAL 2D-VARIATION MODELING FOR GENERAL TIME SERIES ANALYSIS 中文题目:TimesNet:用于一般时间序列分析的时态二维变异建模 论文链接:https://arxiv.org/abs/2210.02186 论文代…

大专同事一个人7天完成CRM系统开发,怪不得月薪3w

在当今的快节奏商业环境中,成功的关键是敏捷和高效。这使得开发自己的客户关系管理系统(CRM)成为许多企业的迫切需求。CRM有助于跟踪和优化销售线索,管理客户交互,并提高业务效率。但是,对于许多企业来说&a…

大学毕业后,我就去当了2个月外卖骑手,哭了一整晚

先简单介绍一下自己,我来自长沙,大学学的的物流管理专业,现在就职于一家互联网公司,从事软件测试工作。 我来自长沙县的一个偏远农村,家里兄弟姐妹多,父母无力负担我的学费,很多时候学费都是靠姐…

智慧工厂4G+蓝牙+UWB+RTK人员定位系统解决方案

人员定位在智慧工厂的应用正逐渐受到重视,通过使用现代化的技术和智能终端设备,工厂管理者能够实时定位和跟踪员工的位置,方便进行人员调度管理和监督人员的工作情况;人员遇到紧急情况,可通过定位设备一键报警求救&…

智慧消防:如何基于视频与智能分析技术搭建可视化风险预警平台?

一、背景分析 消防安全是一个重要的话题,涉及到每个人的生活和安全。每年都会发生大量的火灾,给人们带来极大的危害,摧毁了大量的财产,甚至造成了可怕的人员伤亡。而消防安全监督管理部门人员有限,消防安全监管缺乏有…

2.2 模型与材质基础

一、渲染管线与模型基础 1. 渲染管线 可编程阶段(蓝色区域): 1顶点着色器 2几何着色器 3片元着色器 2. 模型的实现原理 UV:在建模软件中,进行UV展开,UV会放在一个横向为U纵向为V,范围&#xff0…

TEE GP(Global Platform)功能认证实验室

TEE之GP(Global Platform)认证汇总 GP认证实验室主要面向功能认证、SE安全认证、TEE安全认证,对于TEE来说,则分为TEE功能认证和TEE安全认证。本文对功能认证相关实验室机构进行总结和介绍。 一、国内3家 二、国外3家 参考: GlobalPlatform …

回归预测 | MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络多输入单输出回归预测

回归预测 | MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLA…

安全杂记 - js中的this关键字

javascript里什么是this this是js中的一个关键字&#xff0c;它是函数在运行时生成的一个内部对象&#xff0c;是属性和方法。 this就是属性或方法“当前”所在的对象&#xff0c;也就是调用函数的那个对象 this的使用场合 1.函数调用 <script>var a100;function test…

jenkins部署vue项目

文章目录 1 先安装node.js上传到linux并解压 jenkins 创建任务执行脚本 build Stepsvue jenkins shell 脚本 (jenkins-web.sh)启动 如何在linux上安装jenkins可以看上一篇 linux安装jenkins(详细步骤) 1 先安装node.js 建议最好跟你本地安装版本一致,减少没有必要的麻烦:node.…

UCloud上线可商用LLaMA2镜像,助力AGI应用发展

随着人工智能技术的快速发展&#xff0c;大模型应用在自然语言处理、图像识别、智能交互等领域展现出了巨大的潜力&#xff0c;为企业带来了更多创新和商机。众多企业纷纷将大模型应用于产品开发和业务优化中&#xff0c;希望通过提升智能化水平和用户体验来赢得竞争优势。近日…

【黑马头条之文章详情-静态文件生成】

本笔记内容为黑马头条项目的文章详情-静态文件生成部分 目录 一、思路分析 二、实现步骤 基础知识可参考下面两篇文章 【黑马头条之对象存储服务MinIO】_蛋饼吧的博客-CSDN博客 【黑马头条之freemarker入门】_蛋饼吧的博客-CSDN博客 一、思路分析 文章端创建app相关文章时…

如何获得SOLIDWORKS全认证资格证书!

SolidWorks认证考试 完成SolidWorks认证考试并获得专业SolidWorks认证是一项伟大的成就。它不仅在你的简历上自豪地闪耀&#xff0c;而且还向雇主、决策者和同事展示了你对软件的技能和知识水平。公司通常会将某些策略和标准设定为一项业务&#xff0c;以帮助保持在竞争中的领头…

桃子叶片病害数据集

1.分为三类 健康的桃子叶片 &#xff0c;251张 桃疮痂病一般&#xff0c;857张 桃疮痂病严重&#xff0c;770 张 数据集链接 import os import jsonimport torch from PIL import Image from torchvision import transforms import tkinter as tk from tkinter import file…

MySQL 日志管理

目录 一、四种日志介绍 1.1 错误日志 1.2 通用查询日志 1.3 二进制日志 1.4 慢查询日志 三、查询日志是否已开启 四、分割二进制日志 MySQL的日志默认保存在数据库文件的存储目录&#xff08;一般为/usr/local/mysql/data/&#xff09;。也可以修改配置文件&#xff0c;…