【JavaEE进阶】 Spring使用注解存储对象

文章目录

  • 🌴序言
  • 🍀前置⼯作:配置扫描路径
  • 🎄添加注解存储 Bean 对象
  • 🌳类注解
    • 🚩为什么要这么多类注解
    • 🚩注解之间的联系
  • 🎋⽅法注解 @Bean
    • 🚩⽅法注解需要配合类注解使⽤
  • ⭕总结

🌴序言

在博主前面所写的《【JavaEE进阶】 Spring 的创建和使⽤》中我们已经可以实现基本的 Spring 读取和存储对象的操作了,但在操作的过程中我们发现读取和存储对象并没有想象中的那么“简单”,所以接下来我们要学习更加简单的操作 Bean 对象的⽅法。

在 Spring 中想要更简单的存储和读取对象的核⼼是使⽤注解

之前我们存储 Bean 时,需要在 spring-config 中添加⼀⾏ 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="org.example"></content:component-scan>
</beans>

其中标红的⼀⾏为注册扫描的包,如下图所示

在这里插入图片描述
注意

  • 如果不是在配置的扫描包下的类对象,即使添加了注解,也是不能被存储到 Spring 中的

🎄添加注解存储 Bean 对象

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

  1. 类注解:@Controller、@Service、@Repository、@Component、@Configuration。

  2. ⽅法注解:@Bean。

🌳类注解

由于这五种类注解的使用方式基本相同,所以博主在这里只演示一种即可

@Controller // 将对象存储到 Spring 中
public class UserController {public void sayHi(String name) {System.out.println("Hi," + name);}
}

我们只需要在存储的对象上面添加相应的注解就好,不同的注解有着不同的含义,不过基本使用相同,后面会进行详细介绍

使用注意事项:

  • 由于这是类存储,并不能存储一个类的多个对象

那么如何进行获取呢?

后面会讲更加简单的获取,这里我们还是使用《【JavaEE进阶】 Spring 的创建和使⽤》中所讲的获取方式

public class Application {public static void main(String[] args) {// 1.得到 spring 上下⽂ApplicationContext context =new ClassPathXmlApplicationContext("spring-config.xml");// 2.得到 beanUserController userController = context.getBean("userController",UserController.class);// 3.调⽤ bean ⽅法userController.sayHi("遇事问春风乄");}
}

读取时的注意事项:

  • 由于时类注解,所以我们在获取对象时,我们所填的 id 处的参数有如下约定
    • 当首字母和第二字母没有全部大写时采用:类名首字母小写作为id
    • 当首字母和第二字母全部大写时采用:类名首字母和第二个字母全部小写

🚩为什么要这么多类注解

既然功能是⼀样的,为什么需要这么多的类注解呢?

这和为什么每个省/市都有⾃⼰的⻋牌号是⼀样的?⽐如陕⻄的⻋牌号就是:陕X:XXXXXX,北京的⻋牌号:京X:XXXXXX,⼀样。甚⾄⼀个省不同的县区也是不同的,⽐如⻄安就是,陕A:XXXXX,咸阳:陕B:XXXXXX,宝鸡,陕C:XXXXXX,⼀样。这样做的好处除了可以节约号码之外,更重要的作⽤是可以直观的标识⼀辆⻋的归属地。

那么为什么需要怎么多的类注解也是相同的原因,就是让程序员看到类注解之后,就能直接了解当前类的⽤途,⽐如:

五大类注解用途(重点) :

  1. @Controller (控制器) :归属于业务逻辑层,用来控制用户的行为,它用来检查用户参数的有效性(比如检查用户输入的用户名是否有效)。

  2. @Service (服务) :归属于服务层,调用持久化类实现相应的功能。[不直接和数据库交互的,它类似于控制中心]

  3. @Repository (仓库) :归属于持久层,是直接和数据库进行交互的。通常每一个表都会对应一个@Repos i tory。

  4. @Configuration (配置) :归属于配置层,是用来配置当前项目的一些信息。

  5. @Component (组件) :归属于公共工具类,提供某些公共方法。

在这里插入图片描述

🚩注解之间的联系

查看 @Controller / @Service / @Repository / @Configuration 等注解的源码发现:
在这里插入图片描述

其实这些注解⾥⾯都有⼀个注解 @Component,说明它们本身就是属于 @Component 的“⼦类”

🎋⽅法注解 @Bean

类注解是添加到某个类上的,⽽⽅法注解是放到某个⽅法上的,如以下代码的实现:

首先我们准备Student类如下:

public class Student {private String name;private int old;@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", old=" + old +'}';}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getOld() {return old;}public void setOld(int old) {this.old = old;}
}

然后再创建Students类进行获取每一个Student的对象

package org.example;import org.springframework.context.annotation.Bean;public class Students {@Beanpublic Student student() {Student stu = new Student();stu.setName("遇事问春风乄");stu.setOld(21);return stu;}
}

然⽽,当我们写完以上代码,尝试获取 bean 对象中的 user1 时却发现,根本获取不到

package org.example;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Main {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");Student student = context.getBean("student",Student.class);student.toString();}
}

以上程序的执⾏结果如下:

在这里插入图片描述

🚩⽅法注解需要配合类注解使⽤

在 Spring 框架的设计中,⽅法注解 @Bean 要配合类注解才能将对象正常的存储到 Spring 容器中(在哪一类中使用了注解方法,该类就得加上类注解),如下代码所示:

package org.example;import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Controller;@Controller
public class Students {@Beanpublic Student student() {Student stu = new Student();stu.setName("遇事问春风乄");stu.setOld(21);return stu;}
}

注意事项:

  • 添加类注解的类与添加注解方法的返回类一定要不一样
    在这里插入图片描述

否则就会出现以下问题:

在这里插入图片描述
除此之外,在使用时我们还得知道

我们再进行获取的时候的 id 属性默认为你的方法名

我们也可以对通过设置 name 属性给 Bean 对象进⾏重命名操作。而且可以设置多个,且都能获取到

  • 注意:一但进行重命名操作后,就不能使用默认方法名了

使用代码如下:

@Controller
public class Students {@Bean(name = {"st1","st2","st3"})public Student student() {Student stu = new Student();stu.setName("遇事问春风乄");stu.setOld(21);return stu;}
}
public class Main {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");Student student1 = context.getBean("st1",Student.class);System.out.println(student1.toString());Student student2 = context.getBean("st2",Student.class);System.out.println(student2.toString());Student student3 = context.getBean("st3",Student.class);System.out.println(student3.toString());}
}

在这里插入图片描述

但我们再次使用默认方法名时就会报错:

在这里插入图片描述

另外我们在书写时 name={} 可以省略,如下代码所示

@Controller
public class Students {@Bean({"st1","st2","st3"})public Student student() {Student stu = new Student();stu.setName("遇事问春风乄");stu.setOld(21);return stu;}
}

⭕总结

关于《【JavaEE进阶】 Spring使用注解存储对象》就讲解到这儿,对于取对象,Spring也有更简单的写法,后续博主会给大家一一介绍!感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!

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

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

相关文章

远程服务器QEMU+Ubuntu+GRUB+VNC最佳实践

远程服务器QEMUUbuntuGRUBVNC最佳实践 1. 准备2. QEMU启动安装Ubuntu2.1 服务器端2.2 本地端 3. 从服务器终端控制虚拟机GRUB与虚拟机终端 这段时间参与大量内核切换测试工作&#xff0c;实体机需要硬件自检太过笨重&#xff0c;因此主要通过QEMU验证正确性。有一个很大的问题是…

【送书活动四期】被GitHub 要求强制开启 2FA 双重身份验证,我该怎么办?

记得是因为fork了OpenZeppelin/openzeppelin-contracts的项目&#xff0c;之后就被GitHub 要求强制开启 2FA 双重身份验证了&#xff0c;一拖再拖&#xff0c;再过几天帐户操作将受到限制了&#xff0c;只能去搞一下了 目录 2FA是什么为什么要开启 2FA 验证GitHub 欲在整个平台…

销售技巧培训之女装销售技巧

销售技巧培训之女装销售技巧 一、了解目标客户 在销售女装时&#xff0c;了解目标客户是非常重要的。不同年龄段、不同职业、不同收入的女性对女装的需求和偏好都不同。因此&#xff0c;在销售女装时&#xff0c;需要先了解目标客户的特点和需求&#xff0c;以便更好地推荐适…

干货分享|300平米A级机房设计方案

本方案中XXX计算机中心机房建设工程&#xff0c;是XXX的数据中心&#xff0c;机房位于建筑的X层&#xff0c;计算机机房面积300㎡。采购设备以及装修工艺主要用于XXX所属计算机机房装修工程。 考虑到中心机房投资大、使用周期长&#xff0c;而业主业务发展快&#xff0c;现代技…

使用 HTML 地标角色提高可访问性

请务必确保所有用户都可以访问您的网站&#xff0c;包括使用屏幕阅读器等辅助技术的用户。 一种方法是使用 ARIA 地标角色来帮助屏幕阅读器用户轻松浏览您的网站。使用地标角色还有其他好处&#xff0c;例如改进 HTML 的语义并更轻松地设置网站样式。在这篇博文中&#xff0c;我…

线性回归与逻辑回归:深入解析机器学习的基石模型

摘要:本文详细解析线性回归和逻辑回归,这两种在机器学习领域中最基础且重要的模型。线性回归用于预测连续值输出,通过拟合输入特征和输出标签之间的线性关系进行预测。逻辑回归则适用于分类问题,通过将线性回归预测到的值转化为概率值来进行分类。本文将探讨这两种模型的原…

硬件开发笔记(十五):RK3568底板电路VGA显示接口原理图分析

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/134849296 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

简单了解RNN循环神经网络

为什么需要RNN&#xff08;循环神经网络&#xff09; 将神经网络模型训练好之后&#xff0c;在输入层给定一个x&#xff0c;通过网络之后就能够在输出层得到特定的y&#xff0c;那么既然有了这么强大的模型&#xff0c;为什么还需要RNN&#xff08;循环神经网络&#xff09;呢…

天文馆元宇宙3d展厅打造沉浸式的参观体验

随着科技的不断发展&#xff0c;元宇宙展厅制作平台正逐渐成为企业展示和营销的新宠。这种创新的技术应用为传统展示方式带来了革命性的变革&#xff0c;为企业带来了前所未有的价值。 传统实体展厅受时间、地点、参与人群等各方面限制&#xff0c;成本高且展示内容有限;传统线…

【论文合集】在非欧空间中的图嵌入方法(Graph Embedding in Non-Euclidean Space)

文章目录 1. Hyperbolic Models1.1 Hyperbolic Graph Attention Network1.2 Poincar Embeddings for Learning Hierarchical Representations.1.3 Learning Continuous Hierarchies in the Lorentz Model of Hyperbolic Geometry1.4 Hyperbolic Graph Convolutional Neural Net…

【改进YOLOv8】融合Context_Grided_Network(CGNet)的晶粒大小分布统计系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 目标检测是计算机视觉领域的一个重要研究方向&#xff0c;它在许多应用中发挥着关键作用&#xff0c;如智能监控、自动驾驶、人脸识别等。目标检测的目标是在图像…

Makefile从零基础到入门到熟练使用

Makefile从零基础到入门到熟练使用 一、了解Makefile作用 1、一个文件从源码到可执行文件的过程&#xff1a;预处理-编译-汇编-链接 2、每个步骤都可以单独执行 3、使用过程中会压缩成两步 4、一步执行并且打印详细日志信息 gcc -o hello hello.c -v5、有多个源码文件需要…