【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.得到 bean
		UserController 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;

    @Override
    public 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 {
    @Bean
    public 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 {
    @Bean
    public 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也有更简单的写法,后续博主会给大家一一介绍!感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C //习题10.8 将第7题结果仍存入原有的“stu_sort“文件而不另建立新文件。

C程序设计 &#xff08;第四版&#xff09; 谭浩强 习题10.8 习题10.8 将第7题结果仍存入原有的"stu_sort"文件而不另建立新文件。 IDE工具&#xff1a;VS2010 Note: 使用不同的IDE工具可能有部分差异。 说明&#xff1a;此题同习题10.7的代码&#xff0c;唯一的区…

大数据毕业设计之前端03:logo、menu的折叠展开实现

关键字&#xff1a;BuildAdmin、pinia、logo、aside、menu、菜单折叠、Vue、ElementUI 前言 上一篇文章中&#xff0c;借助aside的实现讲了一些开发的小技巧&#xff0c;以及css的解读。本篇文章主要写一下如何填充aside的内容。 aside主要是由两个部分组成的&#xff1a;log…

Mysql启动占用内存过高解决

Hi, I’m Shendi Mysql启动占用内存过高解决 前言 最近服务器内存不够用了&#xff0c;甚至还出现了内存溢出问题&#xff0c;导致程序宕机。但请求与用户量并没有多少&#xff0c;所以从各种启动的程序中想方设法的尽可能的减少其占用的内存。 而在我的服务器中&#xff0c;…

数字化和数智化一字之差,究竟有何异同点?

在2023杭州云栖大会的一展台内&#xff0c;桌子上放着一颗番茄和一个蛋糕&#xff0c;一旁的机器人手臂融入“通义千问”大模型技术后&#xff0c;变得会“思考”&#xff1a;不仅能描述“看”到了什么&#xff0c;还能确认抓取的是番茄而不是蛋糕。 “传统的机械臂通常都只能基…

从0到1,手把手带你开发截图工具ScreenCap------001实现基本的截图功能

ScreenCap---Version&#xff1a;001 说明 从0到1&#xff0c;手把手带你开发windows端的截屏软件ScreenCap 当前版本&#xff1a;ScreenCap---001 支持全屏截图 支持鼠标拖动截图区域 支持拖拽截图 支持保存全屏截图 支持另存截图到其他位置 GitHub 仓库master下的Scr…

二百一十四、Linux——Linux系统时间比电脑时间慢5分钟

一、目的 服务器重启后&#xff0c;发现Linux的系统时间比电脑时间慢5分钟&#xff0c;于是看了些博客&#xff0c;终于找到了解决方法&#xff0c;记录一下&#xff0c;以防止后面出现同样的问题 二、问题 通过date查看&#xff0c;Linux系统时间比电脑时间慢5分钟 &#…

solidworks打开图纸零件隐藏看不到怎么办?

solidworks打开图纸零件隐藏看不到怎么办&#xff1f;solidworks打开时看不到零件图像&#xff0c;显示空白文档&#xff0c;该怎么解决这个问题呢&#xff1f;下面我们就来看看详细的教程&#xff0c;需要的朋友可以参考下 1、打开SolidWorks &#xff0c;并选中需要打开的零…

【公式】逻辑回归的损失函数是什么

目录 一、逻辑回归简介 二、逻辑回归模型的损失函数 2.1 损失函数与其意义 2.2 逻辑回归的损失函数 2.3 从交叉熵角度理解逻辑回归的损失函数 2.4 从对数似然角度推导逻辑回归的损失函数 三、逻辑回归损失函数的梯度 3.1 逻辑回归损失函数的梯度公式 3.2 用梯度下降法…

家用洗地机希亦、追觅和添可哪款好用?测评PK谁是清洁之王

对于上班族来说&#xff0c;时间非常宝贵&#xff0c;打扫卫生就成为了一件比较痛苦的事情。现在的都市上班族都会寄托于智能家电。在当前市场上&#xff0c;洗地机已成为家庭清洁的面部工具。洗地机是一种高效的清洁设备&#xff0c;以其自动化、高效率的清洁功能&#xff0c;…

我想涨工资,请问测试开发该怎么入门?

我是测试开发工程师!欢迎和我交流测试领域相关问题&#xff08;测试入门、技术、python交流都可以&#xff09; 我几乎是靠这套方法&#xff0c;从一个只会功能测试的小白&#xff0c;到成为测试开发工程师的。 别急&#xff0c;先慢慢看&#xff0c;只要按照下面的流程走一遍…

Elastic Support Hub 转向语义搜索

作者&#xff1a;Chris Blaisure 我们很高兴与大家分享 Elastic Support Hub 最近的增强功能&#xff1a;它现在由语义搜索提供支持&#xff01; 但在我们更详细地了解对 Elastic Support Hub 所做的更改及其对客户的影响之前&#xff0c;我们需要花点时间解释语义搜索的概念&…

java死锁的成因和解决方案

一、什么是死锁&#xff1f; 在Java中&#xff0c;死锁是指两个或多个线程互相持有对方所需要的锁&#xff0c;并且在无法继续执行的情况下永久地等待对方释放锁。这种情况下&#xff0c;所有涉及的线程都无法继续执行&#xff0c;程序被卡住&#xff0c;无法正常终止。 死锁通…

Question 1----dlib问题

复现代码时&#xff0c;在环境里边导入dlib包时一直出现setup.py运行失败&#xff0c;查找网上一些解决方法&#xff0c;使用whl文件本地导入 仍然不能解决&#xff0c;通过向师兄请教&#xff0c;成功解决问题。 首先需要先安装两个库&#xff1a;&#xff08;已经安装好了VS…

pyside/qt03——人机协同的编程教学—直接面向chatGPT实战开发(做中学,事上练)

先大概有个草图框架&#xff0c;一点点丰富 我纠结好久&#xff0c;直接用Python写UI代码 还是用designer做UI 再转Python呢&#xff0c; 因为不管怎么样都要转成Python代码&#xff0c; 想了想还是学一下designer吧&#xff0c;有个中介&#xff0c;有直观理解。 直接这样也可…

“福利”还是“陷阱”?公司给员工放假3个月引发劳动权益争议

近日&#xff0c;广东佛山一家玻璃制造公司的长达3个月放假通知引发广泛关注。这一决策引发了社会对员工福利和公司经营平衡的深入思考。公司表示&#xff0c;此次决策是为了维修老化设备&#xff0c;但随之而来的疑虑则主要集中在员工的收入和劳动权益问题上。 公司表示&…

Java线程池—附阿里巴巴Java开发手册强制规范要求

文章目录 一、线程池概述二、创建线程池三、线程池执行Runnable任务四、线程池执行Callable任务五、线程池工具类&#xff08;Executors&#xff09;—不推荐 一、线程池概述 线程池就是一个可以复用线程的技术。 想象一下&#xff0c;如果不使用线程池会有什么问题&#xff1…

spring IOC介绍

spring的Ioc真是个好东西啊&#xff0c;那它到底是什么东西呢&#xff0c;控制反转&#xff0c;到底是怎么转的呢&#xff1f; 假设啊你现在是一个导演&#xff0c;想排部戏&#xff0c;那是不是得需要演员和舞台(spring中的bean)&#xff0c;如果按平常的编程思维就是new 一个…

女装品牌网站建设的作用如何

服装是任何人都需要的必备品&#xff0c;尤其是女装&#xff0c;由于女性群体爱美追求时尚的心理更高&#xff0c;因此市场中有大量女装品牌以及大量消费者&#xff0c;其规模非常高&#xff0c;众多大小品牌林立及消费征集下&#xff0c;商家们经营也并不太容易&#xff0c;企…

YouTube网红营销:出海品牌扩大影响力的关键

随着数字媒体的兴起&#xff0c;社交媒体已成为品牌与消费者之间建立联系的重要桥梁。其中&#xff0c;YouTube作为全球最大的视频分享平台&#xff0c;不仅拥有庞大的用户群体&#xff0c;还聚集了众多有影响力的网红。这些网红在各自的领域内拥有强大的话语权和号召力&#x…

区块链实验室(28) - 拜占庭节点劫持区块链仿真

在以前的FISCO环境中仿真拜占庭节点攻击区块链网络。该环境共有100个节点&#xff0c;采用PBFT作为共识机制&#xff0c;节点编号分别为&#xff1a;Node0&#xff0c;Node&#xff0c;… &#xff0c;Node99。这100个节点的前2010区块完全相同&#xff0c;自区块2011开始分叉。…