Spring 使用注解储存对象

news2024/11/24 5:06:03

文章目录

  • 前言
  • 存储 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. 从上下文对象中得到需要的 bean
        UserController 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 {
    @Bean
    public 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.coloradmin.cn/o/856320.html

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

相关文章

MySQL DAL单表练习一(学生表)

目录 步骤&#xff1a; 1、创建学生表 2、插入数据 1&#xff09;查询表中所有学生的信息 2&#xff09;查询表中所有学生的姓名和英语成绩 3&#xff09; 过滤表中的重复数据 4&#xff09; 统计每个学生的总分 5&#xff09; 所有学生总分上加上10 6&#xff09; 使…

Java实现COM串口通信

前言 本文主要是实现监听电脑的 com3串口数据 Honeywell的一个扫描识别的器插入 Window笔记本的USB接口。 我的电脑是 Window11的&#xff0c;不需要安装驱动&#xff0c;它自己就有一个 COM3的串口 我把这玩意儿插在我的我电脑的USB接口过后&#xff0c;在电脑的 设备管理器就…

python条件分支和循环语句

python中没有{}的写法&#xff0c;一般时通过缩进的方式来确定分支和循环需要执行的代码块。 if 需要判断的条件表达式:条件成立时的动作 elif 需要判断的条件表达式:条件成立时的动作 else:动作for 变量 in 迭代对象:动作 示例&#xff1a; while 退出条件:动作

【MySql】RR有幻读问题吗?MVCC能否解决幻读?

文章目录 前言RR 隔离级别MVCCRR MVCC 有幻读问题吗&#xff1f;幻读问题演示如何彻底解决幻读&#xff1f;小结 前言 幻读是 MySQL 中一个非常普遍&#xff0c;且面试中经常被问到的问题&#xff0c;如果你还搞不懂什么是幻读&#xff1f;什么是 MVCC&#xff1f;以及 MySQL…

JRebel激活服务搭建彻底解决第三方服务失效问题

下载代理激活服务 下载地址 启动服务 激活插件 随机序列号生成地址&#xff1a;GUID online erstellen 激活地址为&#xff1a;http://127.0.0.1:8888/自己生成的GUID 完成激活 参考资料&#xff1a;2023idea中热部署插件JRebel的激活方式

最长上升序列II

最长上升序列II 有N个数放在一个圆周上&#xff0c;可以从任意一个位置开始按照顺时针方向访问数据一圈&#xff0c;沿途可以挑选一些数&#xff0c;要求这些数是上升的&#xff08;一个比一个大&#xff09;。问最多能选多少个数&#xff1f; 输入格式 第一行&#xff1a;1个…

Kafka与Zookeeper版本对应关系

文章目录 了解版本对应Kafka安装包Kafka源码包 了解 比如&#xff1a; kafka_2.11-1.1.1.jar包 其中2.11表示的是Scala的版本&#xff0c;因为Kafka服务器端代码完全由Scala语音编写。”-“后面的1.1.1表示的kafka的版本信息。遵循一个基本原则&#xff0c;Kafka客户端版本和服…

TP、TN、FP、FN的理解

TP、TN、FP、FN的理解 理解英文意思&#xff1a; 在第2个单词的基础上理解第1个单词&#xff08;即第2个单词是前提条件&#xff09; TP&#xff1a;True Positive 判定为真的&#xff08;positive&#xff09;&#xff0c;且判定对了&#xff08;true&#xff09; TN&…

解决selenium的“can‘t access dead object”错误

目录 问题描述 原因 解决方法 示例代码 资料获取方法 问题描述 在python执行过程中&#xff0c;提示selenium.common.exceptions.WebDriverException: Message: TypeError: cant access dead object 原因 原因是代码中用到了frame,获取元素前需要切换到frame才能定位到…

【TypeScript】中关于 { 声明合并 } 的使用及注意事项

概念&#xff1a; 在TS中&#xff0c;如果定义了多个相同命名的函数&#xff0c;接口或者class 类&#xff0c;那么它们会自动合并成一个类型 函数的合并&#xff1a; 前面章节讲解的函数重载就是使用了定义多个函数的类型进行合并&#xff1a; function reverse(x: number):…

Git介绍及常用命令详解

一、Git的概述 Git是一个分布式版本控制工具&#xff0c;通常用来对软件开发过程中的源代码文件进行管理。 Git 会跟踪我们对文件所做的更改&#xff0c;因此我们可以记录已完成的工作&#xff0c;并且可以在需要时恢复到特定或以前的版本。Git 还使多人协作变得更加容易&…

渐进式云渲染和模块式云渲染:二者的区别与选择

云渲染是一种利用云计算技术&#xff0c;将本地的渲染任务分配到远程的服务器上进行高效、快速、低成本的渲染的服务。云渲染可以帮助用户节省时间、资金和硬件资源&#xff0c;提高工作效率和质量。但是&#xff0c;在使用云渲染时&#xff0c;用户需要面对一个重要的选择&…

unable to write symref for HEAD: Permission denied

今天从gitee上面克隆项目到本地时报错如下 warning: unable to unlink ‘D:/IDEAcode/ruiji1.0/.git/HEAD.lock’: Invalid argument error: unable to write symref for HEAD: Permission denied 解决方法&#xff1a;将要存放项目的文件夹权限修改为完全控制 原先权限&…

Unity游戏源码分享-乐节奏休闲游戏源码 guitar hero 支持mobile

Unity游戏源码分享-乐节奏休闲游戏源码 guitar hero 支持mobile 完整版下载地址&#xff1a;https://download.csdn.net/download/Highning0007/88198766

tcl学习之路(四)(vivado设计分析)

1.FPGA芯片架构中的对象 在打开elaborated/synthesied/implemented的情况下&#xff0c;可使用如下命令获取期望的SLICE。SLICE分为SLICEL和SLICEM&#xff0c;由LUT、FF、MUX、CARRY组成。 set all_slice [get_sites SLICE*] set col_slice [get_sites SLICEX0Y*] set all_sl…

Golang bitset 基本使用

安装&#xff1a; go get github.com/bits-and-blooms/bitset下面代码把fmtx换成fmt就行 //------------基本操作------------//构建一个64bit长度的bitsetb : bitset.New(64)//放入一个数b.Set(10)fmtx.Println("add-10&#xff1a;", b.DumpAsBits()) // 0000000…

HttpRunner搭建接口自动化测试项目

前言&#xff1a;前面写过一篇PytestAllure接口自动化测试框架搭建的博客&#xff0c;这篇博客学习另外一款优秀的开源的接口自动化测试框架&#xff1a;HttpRunner&#xff0c;本博客主要学习如何搭建基于HttpRunner的接口自动化测试项目 PytestAllure接口自动化测试框架搭建…

11款UML/SysML建模工具更新(2023.7)Papyrus、UModel……

DDD领域驱动设计批评文集 欢迎加入“软件方法建模师”群 《软件方法》各章合集 最近一段时间更新的工具有&#xff1a; 工具最新版本&#xff1a;drawio-desktop 21.6.5 更新时间&#xff1a;2023年7月22日 工具简介 开源绘图工具&#xff0c;用Electron编写&#xff0c;…

【office】world设置标题

这里写目录标题 一、整理样式库二、设置标题编号三、设置标题其它信息1.设置 标题 1a.设置字体b.设置边框c.设置段落 2.设置 标题 2a.设置字体b.设置边框 3.设置 标题 3a.设置字体b.设置边框 4.设置 标题 4a.设置字体 5.设置 标题 5a.设置字体 一、整理样式库 1.选择“开始” …

【腾讯云 Cloud Studio 实战训练营】提升开发效率与协作:探索腾讯云 Cloud Studio 的强大功能与优势

文章目录 一、前言二、认识腾讯云 Cloud Studio2.1 什么是云端开发环境2.2 CDE 的特点与优点2.2.1 提高效率&#xff0c;开发环境一键运行2.2.2 提高生产力&#xff0c;可以并行的工作2.2.3 开发更加规范2.2.4 提供监管&#xff0c;降低资本与资源 2.3 云端开发环境具备的四大要…