Spring 使用注解储存对象

文章目录

  • 前言
  • 存储 Bean 对象
    • 五大注解
      • 五大注解示例
      • 配置包扫描路径
      • 读取bean的示例
    • 方法注解 @Bean
  • Bean 命名规则
  • 重命名 Bean

前言

通过在 spring-config 中添加bean的注册内容,我们已经可以实现基本的Spring读取和存储对象的操作了,但在操作中我们发现读取和存储并没有那么简单,接下来我们来学习更加简单的操作Bean对象的方法。

在Spring中想要更简单的存储和读取对象的核心是使用注解,接下来我们来了解一下Spring中的相关注解,来存储对象。

存储 Bean 对象

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

  1. 类注解:@Controller、@Service、@Repository、@Component、@Configuration。(五大注解)
  2. 方法注解:@Bean

五大注解

在 Spring 框架中,有一些核心的注解被认为是 “Spring 的五大注解”,它们分别是:

  1. @Component@Component 是一个通用的注解,用于标记一个类为 Spring 托管的组件。它可以被用于任何层(如数据访问、业务逻辑、控制器等),并告诉 Spring 在应用程序的上下文中自动创建并管理这些组件。

  2. @Repository@Repository 是用于标识数据访问层(DAO)组件的注解。它扩展了 @Component,并且通常被用于与数据库进行交互的组件。它提供了一些数据库访问的特殊功能,如异常转换。

  3. @Service@Service 是用于标识服务层组件的注解。它也扩展了 @Component,并且通常用于包含业务逻辑的组件。在应用程序中,服务层通常协调数据访问和业务逻辑之间的交互。

  4. @Controller@Controller 是用于标识控制器层组件的注解。它表示这个类是一个 Spring MVC 控制器,用于处理 HTTP 请求并返回响应。通常,它处理用户界面的交互,负责将用户请求映射到相应的处理方法。

  5. @RestController@RestController 是 Spring 4.0 版本引入的注解,用于标识 RESTful 风格的控制器。与 @Controller 不同的是,@RestController 不仅处理请求映射,还会自动将方法返回值转换为 JSON 或 XML 格式的响应。

这些注解是 Spring 框架中非常重要的一部分,它们使得应用程序的组件管理、数据访问、业务逻辑和控制器层的开发更加简单和高效。

五大注解示例

当使用 Spring 框架时,可以通过以下示例展示每个注解的用法:

  1. @Component 示例:
import org.springframework.stereotype.Component;@Component
public class MyComponent {// 类的定义
}
  1. @Repository 示例:
import org.springframework.stereotype.Repository;@Repository
public class UserRepository {// 数据访问相关代码
}
  1. @Service 示例:
import org.springframework.stereotype.Service;@Service
public class UserService {// 业务逻辑相关代码
}
  1. @Controller 示例:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;@Controller
public class HomeController {@GetMapping("/home")public String homePage() {return "index";}
}
  1. @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”。
参数
name - 要去大写的字符串。
返回 返回 返回 返回值值值值
字符串的去首字母版本。

我们把读取的第一个字母变成大写,就可以了
在这里插入图片描述

重命名 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;}
}

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

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

相关文章

每日一题——滑动窗口的最大值

滑动窗口的最大值 题目链接 暴力解法 最容易想到的当然还是通过两层循环来暴力求解&#xff1a;一层循环用来移动窗口&#xff0c;一层循环用来在窗口内找到最大值。这种做法的时间复杂度为O(kN)&#xff0c;会超出时间限制&#xff0c;因此&#xff0c;我们要找到更加高效的…

springboot国际化

springboot国际化 不需要引入额外的jar包 参考&#xff1a;https://zhuanlan.zhihu.com/p/551605839 1.rources要创建Resource Bundle 2.yml配置中引入Resource Bundle 引入Resource Bundle spring:messages:encoding: UTF-8basename: i18n/messages_common3.创建国际化工具…

彩色图转灰度图之c++实现(qt + 不调包)

1.介绍 在日常生活中&#xff0c;我们经常看到的图片是彩色图片&#xff0c;有时我们需要将彩色图片转换成灰度图片来处理&#xff0c;也就是将RGB三通道图片按照一定规则转换成一通道图片。 2.转换方式 彩色图片转灰度图片&#xff0c;一般有三种方法 第一种&#xff1a;平均法…

海思ss928部署手写数字识别模型

大致流程--------------------------------------------------------------------------------------------------------------------- 模型转换---------------------------------------------------------------------------------------------------- 1&#xff1a;准备MNI…

【EI复现】考虑区域多能源系统集群协同优化的联合需求侧响应模型(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

企业前后端分离软件架构如何设计?

企业前后端分离软件架构的设计涉及到前端和后端的独立性、通信方式、数据流管理等多个方面。下面我将为你介绍一个常见的前后端分离软件架构设计&#xff1a; 1、前端层&#xff1a; 框架选择&#xff1a;选择适合项目需求的前端框架&#xff0c;例如React、Vue.js、Angular等…

面试题记录

面试题记录 一.Vue中的合成事件和原生事件有哪些区别。二.parseint(3,2)返回什么值&#xff1f;为什么三.什么是闭包四.vue3和vue2区别有哪些五.vue3 响应式原理 双向绑定原理1. 响应式原理&#xff1a;2. 双向绑定原理&#xff1a;Vue3 中双向绑定的原理&#xff1a;下面是 Vu…

https的原理和方案

文章目录 https原理为什么要加密常见的加密方式对称加密非对称加密数据摘要&&数据指纹数据签名 https的几种工作方案方案一&#xff1a;只使用对称加密方案二&#xff1a;只使用非对称加密方案三&#xff1a;两端都使用非对称加密方案四&#xff1a;非对称加密 对称加…

苹果账号被禁用怎么办?

苹果账号被禁用怎么办&#xff1f; 转载&#xff1a;苹果账号被禁用怎么办&#xff1f; 当我们使用苹果手机登录App Store时&#xff0c;有时会遇到账号被禁用的提示。总结下来&#xff0c; 账号被禁用的原因可能有以下几种&#xff1a; 禁用的原因 1.在不同的设备上登录Ap…

CSS前端开发指南:创造精美的用户界面

简介&#xff1a; 《CSS前端开发指南&#xff1a;创造精美的用户界面》是一本旨在帮助读者掌握CSS技术&#xff0c;实现令人惊叹的前端用户界面的实用指南。无论您是初学者还是有经验的开发者&#xff0c;本书都将为您提供全面的知识和实用技巧&#xff0c;帮助您创建引人注目…

c语言每日一练(5)

前言&#xff1a;每日一练系列&#xff0c;每一期都包含5道选择题&#xff0c;2道编程题&#xff0c;博主会尽可能详细地进行讲解&#xff0c;令初学者也能听的清晰。每日一练系列会持续更新&#xff0c;暑假时三天之内必有一更&#xff0c;到了开学之后&#xff0c;将看学业情…

什么是设计模式?

目录 概述: 什么是模式&#xff01;&#xff01; 为什么学习模式&#xff01;&#xff01; 模式和框架的比较&#xff1a; 设计模式研究的历史 关于pattern的历史 Gang of Four(GoF) 关于”Design”Pattern” 重提&#xff1a;指导模式设计的三个概念 1.重用(reuse)…

函数式接口Consumer、BiConsumer、Supplier、Predicate、Function、BiFunction

函数式接口Consumer、BiConsumer、Supplier、Predicate、Function、BiFunction 1.Consumer Java Consumer接口来自Java 8中引入的 java.util.function包。 Consumer是一个功能接口&#xff0c;用来作为lambda表达式或方法引用的任务目标(传递一个参数执行指定的方法)。 Cons…

opencv基础48-绘制图像轮廓并切割示例-cv2.drawContours()

绘制图像轮廓&#xff1a;drawContours函数 在 OpenCV 中&#xff0c;可以使用函数 cv2.drawContours()绘制图像轮廓。该函数的语法格式是&#xff1a; imagecv2.drawContours( image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]…

c基础扫雷

和三子棋一样&#xff0c;主函数先设计游戏菜单界面&#xff0c;这里就不做展示了。 初始化棋盘 初级扫雷大小为9*9的棋盘&#xff0c;但排雷是周围一圈进行排雷(8格)&#xff0c;而边界可能会越界。数组扩大了一圈,行和列都加了2&#xff0c;所以我们用一个11*11的数组来初始化…

计算机科技历史纵横:8月6日的十大里程碑

计算机科技历史纵横&#xff1a;8月6日的十大里程碑 目录 引言1951年&#xff1a;EDSAC电脑完成第一个实际计算任务1964年&#xff1a;IBM发布System/360系列1973年&#xff1a;Xerox PARC开发出第一台个人电脑Xerox Alto1976年&#xff1a;Apple发布Apple I电脑1981年&#…

UDS诊断笔记

文章目录 常见缩写简介UDS寻址模式1. 物理寻址&#xff08;点对点、一对一&#xff09;2. 功能寻址&#xff08;广播、一对多&#xff09;3. 功能寻址使用场景举例 UDS报文格式UDS协议栈网络层网络层功能网络层协议1. 单帧 SF&#xff08;Single Frame&#xff09;2. 首帧 FC&a…

教你一招:非计算机科班如何丝滑转码?

近年来&#xff0c;很多人想要从其他行业跳槽转入计算机领域。非计算机科班如何丝滑转码&#xff1f; 目录 一、确定方向 二、确定学习计划&#xff08;自学&#xff09; 三、学习 看到组里好多非科班姐妹决定转码之后&#xff0c;因为相关背景知识不足难以确定学习计划&am…

【机密计算-大厂有话说】微软 Open Enclave SDK

前言 机密计算是基于硬件支持的可信执行环境的&#xff0c;比如 Intel SGX 硬件技术上面的 enclave 以及 Arm Trustzone 上的 OT-TEE&#xff0c;不过这些异构的 TEE 之间差异还是蛮大的&#xff0c;所以亟需一种能够屏蔽 TEE 差异软件中间件或者 SDK&#xff0c;这就是本文将要…

JavaScript 中替换所有匹配项的自定义函数非正则表达式

引言 在 JavaScript 中&#xff0c;字符串替换是常见的操作之一。虽然 JavaScript 提供了一些内置的字符串方法来实现替换&#xff0c;比如 replace() 方法&#xff0c;但它只会替换第一个匹配到的项。如果我们想要替换所有匹配到的项&#xff0c;就需要自己编写一个函数。本文…