Spring 使用注解储存对象
文章目录
- 前言
- 存储 Bean 对象
- 五大注解
- 五大注解示例
- 配置包扫描路径
- 读取bean的示例
- 方法注解 @Bean
- Bean 命名规则
- 重命名 Bean
前言
通过在 spring-config 中添加bean的注册内容,我们已经可以实现基本的Spring读取和存储对象的操作了,但在操作中我们发现读取和存储并没有那么简单,接下来我们来学习更加简单的操作Bean对象的方法。
在Spring中想要更简单的存储和读取对象的核心是使用注解,接下来我们来了解一下Spring中的相关注解,来存储对象。
存储 Bean 对象
想要将对象存储在 Spring 中,有两种注解类型可以实现:
- 类注解:@Controller、@Service、@Repository、@Component、@Configuration。(五大注解)
- 方法注解:@Bean
五大注解
在 Spring 框架中,有一些核心的注解被认为是 “Spring 的五大注解”,它们分别是:
-
@Component:@Component是一个通用的注解,用于标记一个类为 Spring 托管的组件。它可以被用于任何层(如数据访问、业务逻辑、控制器等),并告诉 Spring 在应用程序的上下文中自动创建并管理这些组件。 -
@Repository:@Repository是用于标识数据访问层(DAO)组件的注解。它扩展了@Component,并且通常被用于与数据库进行交互的组件。它提供了一些数据库访问的特殊功能,如异常转换。 -
@Service:@Service是用于标识服务层组件的注解。它也扩展了@Component,并且通常用于包含业务逻辑的组件。在应用程序中,服务层通常协调数据访问和业务逻辑之间的交互。 -
@Controller:@Controller是用于标识控制器层组件的注解。它表示这个类是一个 Spring MVC 控制器,用于处理 HTTP 请求并返回响应。通常,它处理用户界面的交互,负责将用户请求映射到相应的处理方法。 -
@RestController:@RestController是 Spring 4.0 版本引入的注解,用于标识 RESTful 风格的控制器。与@Controller不同的是,@RestController不仅处理请求映射,还会自动将方法返回值转换为 JSON 或 XML 格式的响应。
这些注解是 Spring 框架中非常重要的一部分,它们使得应用程序的组件管理、数据访问、业务逻辑和控制器层的开发更加简单和高效。
五大注解示例
当使用 Spring 框架时,可以通过以下示例展示每个注解的用法:
@Component示例:
import org.springframework.stereotype.Component;@Component
public class MyComponent {// 类的定义
}
@Repository示例:
import org.springframework.stereotype.Repository;@Repository
public class UserRepository {// 数据访问相关代码
}
@Service示例:
import org.springframework.stereotype.Service;@Service
public class UserService {// 业务逻辑相关代码
}
@Controller示例:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;@Controller
public class HomeController {@GetMapping("/home")public String homePage() {return "index";}
}
@RestController示例:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ApiController {@GetMapping("/api/greet")public String greet() {return "Hello, world!";}
}
在这些示例中,每个注解都被用于不同的类类型,以表明它们的角色和用途。它们在 Spring 框架中自动被扫描和管理,从而简化了组件的创建和管理过程。
配置包扫描路径
在上面我们介绍了类注解,但是想要将对象成功的存储到 Spring 中,我们还需要配置一下存储对象的扫描包路径,只有配置的包下的所有类,添加了注解才能被正确的识别并保存到 Spring 中。即使添加了注解,如果不是在配置的扫描包下的类对象,也是不能被存储到 Spring 中的。
在 spring-config.xml 中添加如下配置:(有关配置文件的内容请参考spring创建与使用)
除了增加xmlns:context外,还需要在xsi:schemaLocation增加spring-context.xsd描述,然后添加注册扫描的包
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "><context:component-scan base-package="com.fyd"/></beans>
可以把这个配置作为模板,下次直接复制粘贴过去就好了
读取bean的示例
- UserController类
package com.fyd;import org.springframework.stereotype.Controller;@Controller
public class UserController {public void sayHello(String name) {System.out.println("Hello " + name);}
}
- 启动类
import com.fyd.UserController;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {public static void main(String[] args) {// 1. 得到 Spring 的上下文对象ApplicationContext context =new ClassPathXmlApplicationContext("spring-config.xml");// 2. 从上下文对象中得到需要的 beanUserController userController = (UserController) context.getBean("userController");// 3. 使用对象userController.sayHello("fyd");}
}

方法注解 @Bean
类注解是添加到某个类上的,⽽⽅法注解是放到某个⽅法上的。方法注解@Bean要配合类注解才能将对象正常的存储到Spring容器中,如以下代码的实现:
存对象:
package com.fyd;import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;@Component
public class Users {@Beanpublic User user1() {User user = new User();user.setName("fyd");user.setAge(18);return user;}
}
使用对象:
import com.fyd.Users;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {public static void main(String[] args) {ApplicationContext context =new ClassPathXmlApplicationContext("spring-config.xml");Users users = (Users) context.getBean("users");System.out.println(users.user1().getName());}
}
执行效果:

Bean 命名规则
通常我们 bean 使⽤的都是标准的⼤驼峰命名,⽽读取的时候⾸字⺟⼩写就可以获取到 bean 了,如下图所示:

当我们⾸字⺟和第⼆个字⺟都是⼤写时,就不能正常读取到 bean 了,如下图所示:

我们找到Bean命名规则的源码

翻译过来就是
实用程序方法,用于将字符串转换为正常的 Java 变量名大小写。这通常意味着将第一个字符从大写字母转换为小写字母,但在有多个字符且第一个和第二个字符都是大写字母的(不常见的)特殊情况下,我们不对其进行转换。
因此,"FooBah "变成了 “fooBah”,"X "变成了 “x”,但 "URL "仍然是 “URL”。
我们把读取的第一个字母变成大写,就可以了

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

这里的name属性实际上是一个数组,一个bean可以有多个名字。
@Component
public class Users {@Bean(name = {"user1","fyd"})public User user1() {User user = new User();user.setName("fyd");user.setAge(18);return user;}
}
name={}可以省略:
@Component
public class Users {@Bean({"user1","fyd"})public User user1() {User user = new User();user.setName("fyd");user.setAge(18);return user;}
}
相关文章:
Spring 使用注解储存对象
文章目录 前言存储 Bean 对象五大注解五大注解示例配置包扫描路径读取bean的示例 方法注解 Bean Bean 命名规则重命名 Bean 前言 通过在 spring-config 中添加bean的注册内容,我们已经可以实现基本的Spring读取和存储对象的操作了,但在操作中我们发现读…...
一、初始 Spring MVC
文章目录 一、回顾 MVC 模式二、初始 Spring MVC2.1 Spring MVC 核心组件2.1.1 前端控制器(DispatcherServlet)2.1.2 处理器映射器(HandlerMapping)2.1.3 处理器适配器(HandlerAdapter)2.1.3 后端控制器&am…...
《爬虫》爬取页面图片并保存
爬虫 前言代码效果 简单的爬取图片 前言 这几天打算整理与迁移一下博客。因为 CSDN 的 Markdown 编辑器很好用 ,所以全部文章与相关图片都保存在 CSDN。而且 CSDN 支持一键导出自己的文章为 markdown 文件。但导出的文件中图片的连接依旧是 url 连接。为了方便将图…...
【项目部署】JavaScript解析JSON解析报错Unexpected token xxx is not valid JSON
问题背景 这个报错发生在之前部署的一个前后端分离的项目中。后端使用的Spring Boot,前端使用的JavaScript,前后端交互使用Thymeleaf框架。 现象 项目组的另一个小伙伴说,突然有个页面打不开了,整个页面全空白。我F12打开浏览器…...
做接口测试如何上次文件
在日常工作中,经常有上传文件功能的测试场景,因此,本文介绍两种主流编写上传文件接口测试脚本的方法。 首先,要知道文件上传的一般原理:客户端根据文件路径读取文件内容,将文件内容转换成二进制文件流的格式…...
Java SPI机制详解-01
1. 概述 SPI(Service Provider Interface),是 Java 6 引入了一个内置功能,实现服务提供发现和加载机制,使之与特定接口的匹配。 SPI 机制的核心思想就是 解耦 ,将装配的控制权移到程序之外,这…...
由浅入深C系列六:C中实现字符串trim的功能
C中实现字符串trim的功能 简介设计思路代码实现运行效果 简介 一个项目中,需要用c语言实现对字符串中的字定字符进行过滤并从字符串的删除,查询了C语言的基本库,没有发现有这样的函数,于是发挥程序员的主观能力性,自力…...
博客网站添加复制转载提醒弹窗Html代码
网站如果是完全禁止右键(复制、另存为等)操作,对用户来说体验感会降低,但是又不希望自己的原创内容直接被copy,今天飞飞和你们分享几行复制转载提醒弹窗Html代码。 效果展示: 复制以下代码,将其…...
ubuntu下nfs服务安装
操作系统:ubuntu22.04.2 一、服务端安装与配置 1、在服务端安装nfs服务端组件 sudo apt install nfs-kernel-server 2、创建共享目录share并且授权所有人可以访问 sudo mkdir /shared sudo chmod -R 777 /shared 3、配置nfs sudo vim /etc/exports 这将允许…...
Unity框架学习--2
接上文 IOC 容器是一个很方便的模块管理工具。 除了可以用来注册和获取模块,IOC 容器一般还会有一个隐藏的功能,即: 注册接口模块 抽象-实现 这种形式注册和获取对象的方式是符合依赖倒置原则的。 依赖倒置原则(Dependence I…...
WebRTC音视频通话-实现GPUImage视频美颜滤镜效果iOS
WebRTC音视频通话-实现GPUImage视频美颜滤镜效果 在WebRTC音视频通话的GPUImage美颜效果图如下 可以看下 之前搭建ossrs服务,可以查看:https://blog.csdn.net/gloryFlow/article/details/132257196 之前实现iOS端调用ossrs音视频通话,可以查…...
82. 删除排序链表中的重复元素 II
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 解题思路:设置一个新的哑元节点result,作为头节点,将head中不重复地节点依次链接到哑元节点后面,最后返回result.next 初始值&…...
centos 7.x 单用户模式
最近碰到 centos 7.9 一些参数设置错误无法启动系统的情况,研究后可以使用单用户模式进入系统进行恢复操作。 进入启动界面,按 e ro 替换为 rw init/sysroot/bin/sh 替换前 替换后 Ctrl-x 进行重启进入单用户模式 执行 chroot /sysroot 可以查看日…...
取证--理论
资料: 各比赛 Writeup : https://meiyacup.cn/Mo_index_gci_36.html 哔站比赛复盘视频: https://space.bilibili.com/453117423?spm_id_from333.337.search-card.all.click 自动分析取证四部曲 新建案例添加设备自动取证制作报告 取证大…...
Tik Tok娱乐+电商MCN怎么做?
在美国外的热门市场中,TikTok 主要做的区域市场包括中东、拉美、欧洲和东亚,而这里面适合做电商的其实并不多。 欧洲、东亚都属于成熟市场,且 TikTok 本身在欧洲面临 DSA 法案更严格的审查,与在英国相同,欧洲各市场消…...
java 自定义xss校验注解实现
自定义一个注解Xss。名字随意 import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Targe…...
Selenium图片滑块验证码
因为种种原因没能实现愿景的目标,在这里记录一下中间结果,也算是一个收场吧。这篇文章主要是用selenium解决滑块验证码的个别案列。 思路: 用selenium打开浏览器指定网站 将残缺块图片和背景图片下载到本地 对比两张图片的相似地方&#…...
CAP理论与MongoDB一致性,可用性的一些思考
正文 大约在五六年前,第一次接触到了当时已经是hot topic的NoSql。不过那个时候学的用的都是mysql,Nosql对于我而言还是新事物,并没有真正使用,只是不明觉厉。但是印象深刻的是这么一张图片(后来google到图片来自这里&…...
lc2536.子矩阵元素加1
暴力解法:直接按照题目所示在矩阵的相应位置加一 时间复杂度:O(n2 * queries.length) 空间复杂度:O(1) 二维差分:创建二维差分数组,通过对差分数组的修改来影响原来的数组,最后还原 时间复杂度&#x…...
C#使用OpenCv(OpenCVSharp)图像全局二值化处理实例
本文实例演示C#语言中如何使用OpenCv(OpenCVSharp)对图像进行全局二值化处理。 目录 图像二值化原理 函数原型 参数说明 实例 效果 图像二值化原理...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
