当前位置: 首页 > news >正文

【Java】Spring更简单的读取和存储

文章目录

  • Spring更简单的读取和存储对象
    • 1. 存储Bean对象
      • 1.1 前置工作:配置扫描路径
      • 1.2 添加注解存储Bean对象
        • 1.2.1 @Controller(控制器存储)
        • 1.2.2 @Service(服务存储)
        • 1.2.3 @Repository(仓库存储)
        • 1.2.4 @Component(组件存储)
        • 1.2.5 @Configuration
      • 1.3 为什么要这么多类注解
        • 1.3.1 类注解之间的关系
        • 1.3.2 Bean命名规则
      • 1.4 方法注解
        • 1.4.1 方法注解要配合类注解来使用
        • 1.4.2 重命名Bean
    • 2. 获取Bean对象(对象装配)
      • 2.1 属性注入
      • 2.2 构造方法注入
      • 2.3 Setter注入
      • 2.4 三种注入的优缺点
      • 2.5 @Resource:另一种注入关键字
      • 2.6 同一个类型多个@Bean报错
    • 3. 总结

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

我们现在已经可以实现基本的Spring读取和存储对象的操作了,但在操作过程当中。我们发现并没有那么简单。在Spring当中想要更简单的存储和使用对象的核心是使用注解接下了就了解下,如何使用注解来存储和获取Bean

1. 存储Bean对象

之前存储Bean对象,需要添加一行bean才能注册,如下图所示:

在这里插入图片描述

而现在只需要一个注解,就可以代替一行的配置,但是我们先要来点准备工作

1.1 前置工作:配置扫描路径

注意:想要把Bean成功的存储到Spring当中,我们需要配置一下存储对象的扫描包路径,只有被配置的包下的所有类,添加了注解才能被正确识别并保存到Spring当中

spring-config.xml当中添加如下配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:content="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><content:component-scan base-package="com.example.beans"></content:component-scan>
</beans>

在这里插入图片描述

圈起来的是扫描路径,表示所有要存放到Spring中的Bean的根目录

1.2 添加注解存储Bean对象

想要将对象存储到Spring当中,有两种注解类型可以实现:

  1. 类注解:@Controller @Service @Repository @Component @Configuration
  2. 方法注解:@Bean

接下来,分别来看:

1.2.1 @Controller(控制器存储)

@Controller
public class UserController {public void sayHi() {System.out.println("你好Controller");}
}

这时我们按照之前的方法获取到Spring中的Bean

ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
UserController userController = context.getBean("userController", UserController.class);
userController.sayHi();

1.2.2 @Service(服务存储)

@Service
public class UserService {public void sayHi() {System.out.println("你好Service");}
}

1.2.3 @Repository(仓库存储)

@Repository
public class UserRepository {public void sayHi() {System.out.println("你好Repository");}
}

1.2.4 @Component(组件存储)

@Component
public class UserComponent {public void sayHi() {System.out.println("你好Component");}
}

1.2.5 @Configuration

@Configuration
public class UserConfiguration {public void sayHi() {System.out.println("你好Configuration");}
}

1.3 为什么要这么多类注解

既然功能都是一样的,为什么需要这么多呢?

这和为什么每个省/市都有自己的车牌号是一样的?比如陕西车牌号就是:陕XXXXXX,北京车牌号是:京XXXXXXXX。甚至一个省不同的县区车牌号都是不一样的。这样做的好处就是节约了号码,更重要的是可以直观的标识一辆车的归属地

那么为什么需要这么多类的注解也是相同的原因,就是让程序员看到类注解之后,就直接了解当前类的用途。

让代码的可读性提高,让程序员能够直观的判断当前类的用途

比如:

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

程序的工程分层,调用流程如下:

在这里插入图片描述

1.3.1 类注解之间的关系

查看@Controller、@Service、@Repository、@Configuration等注解可以发现:<img 在这里插入图片描述

这些类注解里面都有一个注解@Component,说明它们本身就属于@Component的“子类”

1.3.2 Bean命名规则

通过场面的例子我们可以看出,通常我们bean使用的都是标准大驼峰的命名,而读取的时候首字母小写就可以获取到bean了。

然后当我们首字母和第二个字母都大写的时候,就不能正常的读取到Bean了

这个时候我们就要查询Spring关于Bean存储时生成的命名规则了在这里插入图片描述

源码如下:

public static String decapitalize(String name) {if (name == null || name.length() == 0) {return name;}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.4 方法注解

类注解是添加到某个类上的,而方法注解是放到某个方法当中,如以下代码实现:

public class UserBean {@Beanpublic void sayHi() {System.out.println("你好bean");}
}

但是我们发现根本获取不到。这是为什么?

1.4.1 方法注解要配合类注解来使用

在Spring框架当中,方法注解@Bean要配合类注解才能将对象正常的存储到Spring容器当中,如下代码:

@Component
public class UserBean {@Beanpublic User getUser() {User user = new User();user.setId(1);user.setName("张三");return user;}
}

1.4.2 重命名Bean

可以通过设置name属性给Bean对象进行重命名操作

@Component
public class UserBean {@Bean(name = "user")public User getUser() {User user = new User();user.setId(1);user.setName("张三");return user;}
}

Bean命名规则:当没有设置name属性的时候,那么bean默认的名称就是方法名,当设置了name属性之后,只能通过重命名的那么属性对应的值来获取。也就是说,重命名之后再使用方法名就获取不到了

2. 获取Bean对象(对象装配)

获取bean对象也叫对象装配,是把对象取出来放到某个类当中,也时候也叫作对象注入

对象装配的实现有以下3中方法:

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

2.1 属性注入

在这里插入图片描述

2.2 构造方法注入

在这里插入图片描述

如果当前类当中只存在一个构造方法,那么@Autowired注解可以省略

2.3 Setter注入

在这里插入图片描述

2.4 三种注入的优缺点

  • 属性输入的优点是简介、使用方便;缺点是只能用于IOC容器,如果不是IOC容器不可用,并且只有在使用的时候才会出现NPE(空指针异常)
  • 构造方法注入是Spring推荐的注入方式。它的缺点是如果有多个注入会显得比较臃肿,但是出现这种情况应该考虑一下当前类是否符合程序的单一职责的设计模式了,它的有点在于通用性,在使用之前,一定能保证注入的类不为空
  • Setter方式是Spring前期版本推荐的注入方式,但是通用性不如构造方法,所有Spring版本已经推荐使用构造方法来注入了

2.5 @Resource:另一种注入关键字

@Autowired和@Resource的区别:

  • 出身不同:@Autowired 来自于Spring,而@Resource来自于JDK的注解
  • 使用时设置的参数不同:@Resource支持更多的参数设置,例如name设置,根据名称获取Bean
  • @Autowired可用于Setter注入、够着函数注入、属性注入,而@Resource只能用于Setter和属性注入,不用用于构造函数注入

2.6 同一个类型多个@Bean报错

解决方案有以下两种:

  • 使用@Resource(name=“user1”)定义
  • 使用@Qualifier注解定义名称
@Controller
public class UserController5 {// 注⼊@Autowired@Qualifier(value = "user2")private User user;public User getUser() {return user;}
}

3. 总结

  1. 将对象存储到Spring中:
    1. 使用类注解:@Controller、@Service、@Repository、@Configuration、@Component【它们之间的关系】
    2. 使用方法注解:@Bean【注意事项:必须配合类注解一起使用】
  2. Bean的命名规则:首字母和第二个字母都不是大写,首字母小写来获取Bean,如果首字母和第二个字母都是大写,那么直接使用Bean名来获取Bean
  3. 从Spring中获取对象
    1. 属性注入
    2. Setter注入
    3. 构造方法注入(推荐)
  4. 注入的关键字有
    1. @Autowired
    2. @Resource
  5. @Autowired 和 @Resource 区别:出身不同;使用是设置参数不同@Resource支持更多的参数设置
  6. 解决同一个类型多个Bean的报错
    1. 使用@Resource(name = “”)
    2. 使用@Qualifier(“”)

相关文章:

【Java】Spring更简单的读取和存储

文章目录Spring更简单的读取和存储对象1. 存储Bean对象1.1 前置工作&#xff1a;配置扫描路径1.2 添加注解存储Bean对象1.2.1 Controller(控制器存储)1.2.2 Service(服务存储)1.2.3 Repository(仓库存储)1.2.4 Component(组件存储)1.2.5 Configuration1.3 为什么要这么多类注解…...

Kafka 命令行操作

主题命令行操作 1&#xff09;查看操作主题命令参数 [ubuntuhadoop kafka]$ bin/kafka-topics.sh 参数描述--bootstrap-server连接的KafkaBroker主机名称和端口号。--topic操作的topic名称。--create创建主题。--delete删除主题。--alter修改主题。--list查看所有主题。--desc…...

KUKA机器人_基础编程中的变量和协定

KUKA机器人_基础编程中的变量和协定 KUKA机器人KRL中的数据保存:  每个变量都在计算机的存储器中有一个专门指定的地址  一个变量用非KUKA关键词的名称来表示  每个变量都属于一个专门的数据类型  在应用前必须声明变量的数据类型  在KRL中有局部变量和全局变量之分…...

代码名命规范浅析

日常开发编码中&#xff0c;代码的名命是个大学问&#xff0c;能快速的看懂开源代码的结构和意图&#xff0c;也是一项必备的能力。在java项目的代码结构中&#xff0c;采用长名命的方式来规范类的名命&#xff0c;能够自己表达其主要意图&#xff0c;配合高级IDE&#xff0c;可…...

数据结构第15周 :( 求第k大的数 + 查找3个数组的最小共同元素 + 查找一个循环顺序数组的最小元素 + Crazy Search)

目录求第k大的数查找3个数组的最小共同元素查找一个循环顺序数组的最小元素Crazy Search求第k大的数 【问题描述】 求n个数中第k大的数 【输入形式】 第一行n k&#xff0c;第二行为n个数&#xff0c;都以空格分开 【输出形式】 第k大的数 【样例输入】 10 3 18 21 11 26 12 2…...

【数据结构】Map 和 Set

目录二叉搜索树二叉搜索树---查找二叉搜索树---插入二叉搜索树---删除Map和SetMap的使用Set的使用哈希表哈希冲突冲突避免冲突解决冲突解决---闭散列冲突解决---开散列题目练习只出现一次的数复制带随机指针的链表宝石与石头旧键盘二叉搜索树 二叉搜索树也叫二叉排序树&#x…...

IPVlan 详解

文章目录简介Ipvlan2同节点 Ns 互通Ns 内与宿主机 通信第三种方法Ns 到节点外部结论Ipvlan31. 同节点 Ns 互通Ns 内与宿主机 通信Ns 内到外部网络总结源码分析ipvlan 收包流程收包流程主要探讨使用 ipvlan 为 cni 通过虚拟网卡的实现。简介 ipvlan 和 macvlan 类似&#xff0c…...

直播间的2个小感悟

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 在线人数固定 最近直播间出现了很多新面孔&#xff0c;有的是偶然刷到的&#xff0c;有的是关注互联网找到的。而直播间的人数一直没什么变化&#xff0c;卢松松在抖音直播较少&#xff0c;主播间…...

STM32开发(15)----芯片内部温度传感器

芯片内部温度传感器前言一、什么是内部温度传感器&#xff1f;二、实验过程1.STM32CubeMX配置2.代码实现3.实验结果总结前言 本章介绍STM32芯片温度传感器的使用方法和获取方法。 一、什么是内部温度传感器&#xff1f; STM32 有一个内部的温度传感器&#xff0c;可以用来测…...

Apache Hadoop生态部署-zookeeper分布式安装

目录 查看服务架构图-服务分布、版本信息 一&#xff1a;安装前准备 1&#xff1a;zookeeper安装包选择--官网下载 2&#xff1a;zookeeper3.5.7安装包--百度网盘 二&#xff1a;安装与常用配置 2.1&#xff1a;下载解压zk安装包 2.2&#xff1a;配置环境变量 2.3&#x…...

MySQL(九)

mysql的锁机制 1、MySQL锁的基本介绍 ​ **锁是计算机协调多个进程或线程并发访问某一资源的机制。**在数据库中&#xff0c;除传统的 计算资源&#xff08;如CPU、RAM、I/O等&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一…...

Matlab 计算一条直线与一条线段的交点

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这里假设一条直线的方向为 ( a , b , c ) (a,b,c) (a,b,...

Read book Netty in action(Chapter VI)--ByteBuf

序言 之前学习了传输&#xff0c;通过前面的学习我们都知道&#xff0c;网络数据的基本单位是字节。JDK中提供了ByteBuffer作为字节的容器&#xff0c;但是过于繁琐复杂&#xff0c;Netty中提供了ByteBuf作为替代品。学习一下。 API Netty的数据处理API通过两个组件暴露 ---…...

VsCode开发工具的入门及基本使用

VsCode开发工具的入门及基本使用一、VsCode介绍1.VsCode简介2.VsCode特点二、安装VsCode1.下载VsCode2.安装VsCode3.打开VsCode三、设置VsCode中文1.搜索中文语言插件2.安装中文语言插件四、初识VsCode1.VsCode左侧栏模块2.系统设置功能五、VsCode初始配置1.禁用自动更新2.开启…...

python标准库——OS模块接口详解

OS系统操作模块 os模块提供各种Python 程序与操作系统进行交互的接口 os模块是整理文件和目录最常用的模块 函数作用补充os.sep()取代操作系统特定的路径分隔符os.name()指示你正在使用的工作平台。比如对于Windows&#xff0c;它是nt&#xff0c;而对于Linux/Unix用户&…...

LeetCode 622.设计循环队列

设计你的循环队列实现。 循环队列是一种线性数据结构&#xff0c;其操作表现基于 FIFO&#xff08;先进先出&#xff09;原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里&a…...

OraDump导出套件

OraDump导出套件 只需单击几下即可将数据从Oracle转储文件导出到流行的数据库和格式。 OraDump Export Kit是一个将数据从Oracle转储文件导出到流行数据库和格式的软件包。该产品具有高性能&#xff0c;因为它直接读取转储文件。命令行支持允许编写脚本、自动化和安排转换过程。…...

CVE-2022-22947 SpringCloud GateWay SPEL RCE 漏洞分析

漏洞概要 Spring Cloud Gateway 是Spring Cloud 生态中的API网关&#xff0c;包含限流、过滤等API治理功能。 Spring官方在2022年3月1日发布新版本修复了Spring Cloud Gateway中的一处代码注入漏洞。当actuator端点开启或暴露时&#xff0c;可以通过http请求修改路由&#xff…...

Firebase常用功能和官方Demo简介

一、Firebase简介Firebase刚开始是一家实时后端数据库创业公司&#xff0c;它能帮助开发者很快的写出Web端和移动端的应用。自2014年10月Google收购Firebase以来&#xff0c;用户可以在更方便地使用Firebase的同时&#xff0c;结合Google的云服务。现在的Firebase算是谷歌旗下的…...

MATLAB R2020a 与PreScan8.5.0 详细安装教程(图文版)

目录MATLAB安装PreScan安装每文一语MATLAB安装 MATLAB是一款数学软件&#xff0c;用于科学计算、数据分析和可视化等任务。以下是MATLAB的几个优势&#xff1a; 丰富的工具箱&#xff1a;MATLAB拥有多种工具箱&#xff0c;包括信号处理、图像处理、优化、控制系统等&#xff0…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...