Spring---更简单的存储和读取对象

news2025/1/6 19:23:09

文章目录

  • 存储Bean对象
    • 配置扫描路径
    • 添加注解存储Bean对象
      • 使用类注解
          • 为什么需要五个类注解呢?
          • Bean命名规则
      • 使用方法注解
          • 重命名Bean
  • 读取Bean对象
    • 属性注入
    • Setter注入
    • 构造方法注入
    • 注入多个相同类型的Bean
    • @Autowired vs @Resource

存储Bean对象

配置扫描路径

在这里插入图片描述

注:

  1. 只有在扫描路径下的所有类,添加了注解才能被正确的识别并保存到 Spring 中
  2. 即使添加了注解,但是该类不在扫描路径下也是不能被保存到 Spring 中的

添加注解存储Bean对象

使用注解把 Bean 对象存储到 Spring 中,有两种注解类型可以选择:类注解 和 方法注解,我们下面分别来介绍:

使用类注解

//一共有五种类注解可以进行对象的注册:

@Controller
public class ArticleController {
    public String sayHello(){
        return "hello,controller";
    }
}

@Service
public class UserService {
    public String sayHello(){
        return "hello,service";
    }
}

@Repository
public class UserRepository {
    public String sayHello(){
        return "hello,repository";
    }
}

@Configuration
public class UserConfiguration {
    public String sayHello(){
        return "hello,configuration";
    }
}

@org.springframework.stereotype.Component
public class Component {
    public String sayHello(){
        return "hello,component";
    }
}
//先使用上下文的方式来获取对象,下面介绍更简单的获取对象的方式:

//当使用5大类注解获取bean时,默认 只需要将类名首字母小写即可,  如果bean对象的首字母和第二个字母都是大写时,需要使用原类名才能正确获取到bean对象
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

        ArticleController articleController = context.getBean("articleController",ArticleController.class);
        System.out.println(articleController.sayHello());

        UserService userService = context.getBean("userService",UserService.class);
        System.out.println(userService.sayHello());

        UserRepository userRepository = context.getBean("userRepository",UserRepository.class);
        System.out.println(userRepository.sayHello());

        Component component = context.getBean("component",Component.class);
        System.out.println(component.sayHello());

        UserConfiguration userConfiguration = context.getBean("userConfiguration",UserConfiguration.class);
        System.out.println(userConfiguration.sayHello());
为什么需要五个类注解呢?

在这里使用五个类注解,是为了让程序员看到类注解之后就能直接了解到当前类的用途,不同的类注解的用途是不同的:

  • @Controller:表示业务逻辑层
  • @Service:表示服务层
  • @Repository:表示持久层
  • @Configuration:表示配置层
  • @Component:表示组件

在这里插入图片描述

注:@Component注解是其他四个注解的父类

Bean命名规则

我们配置扫描路径来注册 Bean 对象时并没有设置对象的 id ,那我们通过上下文的方式来获取对象时该使用什么 id 呢?

//我们查看Spring的源码来获取答案:

public static String decapitalize(String name) {
 if (name == null || name.length() == 0) {
 return name;
 }
 // 如果第⼀个字⺟和第⼆个字⺟都为⼤写的情况,是把 bean 的⾸字⺟也⼤写存储了
 if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&
 Character.isUpperCase(name.charAt(0))){
 return name;
 }
 // 否则就将⾸字⺟⼩写
 char chars[] = name.toCharArray();
 chars[0] = Character.toLowerCase(chars[0]);
 return new String(chars);
}

注:通过源码我们可以知道:

  1. 我们通过上下文获取对象的时候,直接使用类名作为 id 即可
  2. 默认情况下,直接将类名的首字母小写作为 id 使用即可;如果类名的首字母和第二个字母都是大写时,需要使用原类名作为 id 使用。

使用方法注解

@Component
public class StudentBeans {
    @Bean
    public Student student(){
        Student student = new Student();
        student.setId(1);
        student.setName("张三");
        student.setAge(18);
        return student;
    }
}

注:

  1. 类注解是添加到某个类上的;方法注解是添加到某个方法上的。
  2. 方法注解要搭配五大类注解一起使用
  3. 方法注解是为了解决不能多次注册同一个类的问题
重命名Bean
@Component
public class StudentBeans {
    @Bean(name = {"s1","s2"})
    public Student student(){
        Student student = new Student();
        student.setId(1);
        student.setName("张三");
        student.setAge(18);
        return student;
    }
}

注:

  1. 重命名Bean后,使用Spring上下文来获取对象时,必须把重命名后的名字作为 id 来使用
  2. 方法注解重命名Bean后解决了不能多次注册同一个类的问题

读取Bean对象

我们通过 Spring 注入的方式来更加简单的获取 Bean 对象,一共有三种注入方式:

属性注入

    @Autowired
    private StudentService studentService;

优点:使用简单
缺点:

  1. 不能注入不可变对象(final对象),因为final类型的变量在调用class的构造函数的这个过程当中就得初始化完成,基于字段的注入是使用set形式注入的
  2. 只适用于Ioc容器
  3. 更容易违背单一设计原则:针对类级

Setter注入

    private StudentService studentService;
    @Autowired
    public void setStudentService(StudentService studentService){
        this.studentService = studentService;
    }

优点:更符合单一设计原则:针对方法级别
缺点:

  1. 不能注入不可变对象(final对象),因为final类型的变量在调用class的构造函数的这个过程当中就得初始化完成,基于字段的注入是使用set形式注入的
  2. 注入对象可被修改

构造方法注入

	private StudentService studentService;
    //当类中只有一个构造方法时   @Autowired可以省略
    //如果类中有多个构造方法(重载)时,需要加上@Autowired来明确使用哪个构造方法来注入对象
    @Autowired
    public StudentController(StudentService studentService){
        this.studentService = studentService;
    }

优点:

  1. 可以注入一个不可变对象(final对象)
  2. 注入的对象可以被修改(可以被final修饰、构造方法只执行一次)
  3. 注入的对象会被完全初始化
  4. 通用性更好

缺点:没有属性注入简单

注入多个相同类型的Bean

注入多个相同类型的 Bean 对象,有两种解决方案:

  • 使用@Resource(name=“ ”)
	@Resource(name="student1")
    private Student student1;

	@Resource(name="student2")
	private Student student2;
  • 使用@Autowired + @Qualifier(value=“ ”)
	@Autowired
	@Qualifier(value="student1")
    private Student student1;

	@Autowired
	@Qualifier(value="student2")
	private Student student2;

@Autowired vs @Resource

相同点:都是用来实现依赖注入的
不同点:

  1. 功能支持不同。@Autowired支持属性注入、setter注入、构造方法注入;而@Resource支持属性注入、setter注入却不支持构造方法注入
  2. 出身不同:@Autowired来自于Spring框架;@Resource来自于JDK
  3. 参数支持不同:@Autowired只支持required参数;@Resource支持更多的参数设置
  4. 依赖识别方式不同:@Autowired默认是以 byType 的方式。也可以使用 @Qualifier 指定 Bean的名称转用 byName 的方式;@Resource默认是以 byName 的方式,当 byName方式无法匹配时,会使用 byType方式

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

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

相关文章

计算机网络TCP篇①

目录 一、TCP 基本信息 1.1、TCP 的头格式 1.2、什么是 TCP 1.3、什么是 TCP 连接 1.4、TCP 与 UDP 的区别 1.2、TCP 连接建立 1.2.1、TCP 三次握手的过程 1.2.2、为什么是三次握手?不是两次?四次?(这个问题真是典中典&am…

python自动化第二篇——合并ppt

简述 python合并ppt的方法有很多,但网上常说的python-pptx的方法,我用不了,这里我用了一个python-office的库。但又两个缺点,第一个生成的文档在你的用户名下的文档里,第二个是名字随机。 import office import os im…

2023_Spark_实验二十四:SparkStreaming读取Kafka数据源:使用Direct方式

SparkStreaming读取Kafka数据源:使用Direct方式 一、前提工作 安装了zookeeper 安装了Kafka 实验环境:kafka zookeeper spark 实验流程 二、实验内容 实验要求:实现的从kafka读取实现wordcount程序 启动zookeeper zk.sh start# zk.sh…

西南科技大学模拟电子技术实验三(BJT单管共射放大电路测试)预习报告

一、计算/设计过程 说明:本实验是验证性实验,计算预测验证结果。是设计性实验一定要从系统指标计算出元件参数过程,越详细越好。用公式输入法完成相关公式内容,不得贴手写图片。(注意:从抽象公式直接得出结果,不得分,页数可根据内容调整) 二、画出并填写实验指导书上…

数据结构 - 堆:TOP-K问题

问题描述 TOP-K问题:即求数据结合中前K个最大的元素或者最小的元素,一般情况下数据量都比较大 比如:专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等 对于Top-K问题,能想到的最简单直接的方式就是排序,但是&…

使用drawio图表,在团队中,做计划,设计和跟踪项目

使用drawio图表,在团队中,做计划,设计和跟踪项目 drawio是一款强大的图表绘制软件,支持在线云端版本以及windows, macOS, linux安装版。 如果想在线直接使用,则直接输入网址draw.io或者使用drawon(桌案), drawon.cn内部…

六、三台主机免密登录和时钟同步

目录 1、免密登录 1.1 为什么要免密登录 1.2 免密 SSH 登录的原理

Sass 同时导出JavaScript 和 CSS变量

Sass 官网 安装插件 注意 sass-loader 版本没设太高,否则会报错 Syntax Error: TypeError: this.getOptions is not a function npm i sass sass-loader10 -D创建 Sass 文件 variables.module.scss。注意这里是 module.scss: 否则报错 Cant find st…

安卓小程序与编译抓包

APK小程序渗透测试 查找bp的证书 在浏览器中打开bp代理,然后在网页中搜索hppps://burp 点击高级——接受风险并继续 拿到证书 将浏览器信任证书 打开设置 搜索证书——查看证书 点击导入——导入证书 证书验证成功后,访问网页(吾爱破解&a…

linux上编写进度条

目录 一、预备的两个小知识1、缓冲区2、回车与换行 二、倒计时程序三、编写入门的进度条四、编写一个正式的五、模拟实现和下载速度相关的进度条 一、预备的两个小知识 1、缓冲区 首先认识一下缓冲区:先写一个.c文件如下: 我们执行一下这个程序时&…

windows ce Remote Process Explorer定位程序崩溃地址

windows ce Remote Process Explorer定位程序崩溃地址 一:下载地址二:使用1)找到程序基准地址2) 定位程序异常位置 一:下载地址 链接:https://pan.baidu.com/s/1fQVBpputtRmynqa95DaPrg 提取码:cx65 二&a…

hdlbits系列verilog解答(真值表)-50

文章目录 一、问题描述二、verilog源码三、仿真结果一、问题描述 本节我们学习用真值表来描述组合逻辑的行为,通过真值表我们将组合逻辑的每一种输入和输出对应值都罗列出来。 对于一个N个输入的布尔函数,理论上有2的N次方输入组合。下表是一个3输入的例子。 假设现在我们来…

Vue---Echarts

项目需要用echarts来做数据展示,现记录vue3引入并使用echarts的过程。 1. 使用步骤 安装 ECharts:使用 npm 或 yarn 等包管理工具安装 ECharts。 npm install echarts 在 Vue 组件中引入 ECharts:在需要使用图表的 Vue 组件中,引入…

探索数据之美:深入学习Plotly库的强大可视化

1. 引言: Plotly 是一个交互性可视化库,可以用于创建各种漂亮的图表和仪表板。它支持多种编程语言,包括Python、R、JavaScript。在Python中,Plotly提供了Plotly Express和Graph Objects两个主要的绘图接口。 2. Plotly库简介&am…

第九节HarmonyOS 常用基础组件1-Text

一、组件介绍 组件(Component)是界面搭建与显示的最小单位,HarmonyOS ArkUI声名式为开发者提供了丰富多样的UI组件,我们可以使用这些组件轻松的编写出更加丰富、漂亮的界面。 组件根据功能可以分为以下五大类:基础组件…

优化生产流程,开启智能制造新时代——探索MES生产管理系统的优势

在当今高度竞争且日益全球化的制造业环境中,企业需要不断提升生产效率,同时也要降低成本。作为一种先进的生产管理工具,MES生产管理系统正在全球范围内受到制造业的广泛关注。本文将深入探讨MES生产管理系统的优势以及如何帮助企业实现这些目…

00后卷王真的很卷吗?

前言 都在传00后躺平、整顿职场,但该说不说,是真的卷,感觉我都要被卷废了... 前段时间,公司招了一个年轻人,其中有一个是00后,工作才一年多,直接跳槽到我们公司,薪资据说有18K&…

时序预测 | Python实现TCN时间卷积神经网络时间序列预测(多图,多指标)

时序预测 | Python实现TCN时间卷积神经网络时间序列预测(多图,多指标) 目录 时序预测 | Python实现TCN时间卷积神经网络时间序列预测(多图,多指标)预测效果基本介绍环境准备程序设计参考资料预测效果 基本介绍

分享4个工具,轻松搞定PDF和图像中提取文本

大型语言模型已经席卷了互联网,导致更多的人没有认真关注使用这些模型最重要的部分:高质量的数据! 本文旨在提供一些有效从任何类型文档中提取文本的技术。 Python库 本文专注于Pytesseract、easyOCR、PyPDF2和LangChain库。实验数据是一个…

新功能?浅谈nuclei的反制思路

code新功能? 写poc时,习惯性查官方文档的时候,注意到了一个新的功能:code 链接直达:https://docs.projectdiscovery.io/templates/protocols/code 大概翻译下: Nuclei 支持在主机操作系统上执行外部代码。…