JavaEE进阶第三课:Spring更简单的对象存储和取出(上)

news2024/11/25 4:32:33

上篇文章介绍了Spring的创建和使用,讲解3了Bean对象的基本存储和取出,这篇文章我们将会介绍Spring更简单的对象存储

目录

    • 1.Bean的存储
    • 1.0准备工作
    • 1.1五大类注解
      • 1.1.2为什么要有这么多注解
    • 1.2方法注解
      • 1.1.1方法注解需要搭配类注解一起使用
      • 1.2.2方法重载怎么办
    • 小结

1.Bean的存储

原先Bean的存储,是先通过在xml的配置文件内增加bean标签,Spring再根据标签内容进行存储。
在这里插入图片描述
这种方法有个缺点就是如果我们要存储多个对象,效率就会很低,因为你要注册多个bean标签。如何更简单的注册多个对象呢?我们可以采用添加注解的方式来解决。

1.0准备工作

想要用到注解,我们必须先配置一下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="com.bit.service"></content:component-scan>
</beans>

这里唯一需要修改的点就是:
在这里插入图片描述
注意base-package的内容,这里填写的就是你想注册到Spring对象所在的包名。你填com.bit.service,存储对象是就会存储service中所有类对应的对象,当然如果sevice底下还有包,里面的内容也会被存储。
如果你想存储java文件(文件目录蓝色的那个java)下所有的类对应的对象,就填**,不过**效率太低,不推荐。

1.1五大类注解

五大类注解:
@Controller(控制器存储)
@Service(服务存储)
@Repository(仓库存储)
@Component(组件存储)
@Configuration(配置存储)

这五个注解的使用方式都一样,最大区别就是它们的含义,这里先说使用,一注解@Controller为例

首先,我们创建两个类,一个类App负责执行main方法,另一个ControllerUser用于存入Spring

@Controller
public class ControllerUser {
    public void fun(){
        System.out.println("我是ControllerUser的fun方法");
    }
}

那么main函数里面的代码和之前取对象的代码一样,先获取Spring上下文对象,再调用它的getBean方法。不过有一个,我们getBean的参数怎么填?因为我们这里是没有id的,看了上一篇文章了同学,就会想到,可以通过类对象的方法来解决:
ControllerUser controllerUser =context.getBean(ControllerUser.class);
这样是可以获取到我们的对象的,如果想通过传入字符串的方式获取,当然也有方法。可以根据Spring的内置的约定来获取。约定源码:
在这里插入图片描述
阅读完源码,可以得到约定:
Spring约定不同的类名定义风格对应不同的参数:
1.ClassName 首字母小写
2.className 首字母小写
3.CName 使用原类名
总结 除了类名是首字母和第二个字母均大写的情况使用原类名,其余全部为小写类名首字母即可。
————————————————————————
如果想查看源码的话,可采用以下操作:
1.在这里插入图片描述
该类名翻译过来就是:注解对象名称生成器
2.找到generateBeanName方法,进入buildDefaultBeanName方法,再进入decapitalize方法即可。

1.1.2为什么要有这么多注解

既然使用方式都一样,相信大家都有一个疑问?为什么还要有五个注解呢,这不是多次四举吗。
那么为什么要有这么多,我们得对着项目来考虑。对于一个项目,分为很多部分:有用户输入信息部分,有根据输入信息执行不同动作的部分,有专门访问数据库的部分等等,这么多注解就是为了帮助我们进行分类,如果所有的类都使用一种注解,就降低了代码的易读性。
那么这些注解都有哪些含义呢?

@Controller:表示的是业务逻辑层;
@Servie:服务层;
@Repository:持久层;
@Configuration:配置层

• 业务逻辑层主要针对用户输入等等
• 服务层是根据不同的输入调用不同的访问数据库的方法等等,它不直接访问数据库
• 持久层有点抽象,持久化存储就是数据库,它主要负责访问不同的数据库
• 配置层 程序的各种配置
用图来表示:
在这里插入图片描述

这里没有提到@Component(组件存储),却又处处存在@Component,因为这四个注解都是@Component的子类,翻阅源码就可以看到了。

1.2方法注解

1.1.1方法注解需要搭配类注解一起使用

@Bean

这个注解是将修饰方法的返回值对象注册到Spring中
我们创建三个类:
User被存储,BeanUser包含一个返回User对象的方法,App执行main函数。

public class User {
    public int id;

    public User(int id) {
        this.id = id;
    }

    public void fun(){
        System.out.println("我是User的fun方法");
    }
}

public class BeanUser {
    @Bean
    public User getUser(){
        return new User(99);
    }
}

public class App {

    public static void main(String[] args) {
        ApplicationContext context=
                new ClassPathXmlApplicationContext("spring-config.xml");
        User user=(User) context.getBean("");
        System.out.println(user.id);
    }

这里依然是不知道,getBean的参数,这里的话就不买关子,这里的默认参数是被注解的方法名,这里就是getUser。我们执行一下:
在这里插入图片描述
结果报错了,这是这么回事呢?查看自己的参数没问题啊,说明取是没问题的,那么肯定就是存出了问题。
使用方法注解需要搭配类注解一起使用也就是BeanUser需要添加类注解,这是为什么呢?
因为方法注解是在类里面的,Spring扫描我们的包时,先考虑有类注解的类,再在它的基础上看有没有方法注解的方法,这样是为了提高效率,不然一个类那么多方法要扫描到什么时候。
那么我们来加上类注解::
在这里插入图片描述
结果正确!

1.2.2方法重载怎么办

我们知道,给方法添加注解很大的问题就是方法重名怎么办?我们的getBean参数又怎么填呢?那么可以通过重命名的方式来处理:
在这里插入图片描述
名称可以有多个,但是一旦使用重命名,之前的方法名获取就会失效。
缩写:@Bean({"n1","n2"})

小结

这篇文章主要介绍更简单的Bean对象的存储,下一篇会介绍更简单的对象取出,喜欢的话还请多多关注点赞!

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

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

相关文章

详细实例说明+典型案例实现 对迭代法进行全面分析 | C++

第四章 迭代法 目录 ●第四章 迭代法 ●前言 ●一、迭代法是什么&#xff1f; 1.简要介绍 2.代码示例&#xff08;简单理解&#xff09; 3.生活实例 ●二、迭代法的典型案例——开平方&帕斯卡三角形 1.开平方 2.帕斯卡三角形 ●总结 前言 简单的来…

游戏服务器如何维护

随着游戏的不断发展&#xff0c;游戏服务器的维护的重要性日益提升。对于玩家而言&#xff0c;他们需要得到更好的体验和更快的速度来享受这个娱乐项目。而对于运营者来说&#xff0c;则是确保安全运行、避免中断或者延迟的工作。本文就将介绍游戏服务器如何维护。如果你的游戏…

基于混沌系统和DNA算法的RGB图像加密(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 本文介绍了基于混沌系统和DNA编码的彩色数字图像加密、解密、抗噪声性能分析以及抗裁剪性能分析。 &#x1f4da;2 运行结果 &…

Linux cksum命令

Linux cksum命令用于检查文件的CRC是否正确。确保文件从一个系统传输到另一个系统的过程中不被损坏。CRC是一种排错检查方式&#xff0c;该校验法的标准由CCITT所指定&#xff0c;至少可检测到99.998%的已知错误。指定文件交由指令"cksum"进行校验后&#xff0c;该指…

Stream 管道流

文章目录前言Stream Api1、流的创建2、中间操作2.1、有状态① distinct② sorted③ limit④ skip⑤ concat2.2、无状态① filter② map③ flatMap④ peek⑤ mapToInt、mapToLong、mapToDouble、flatMapToDouble、flatMapToInt、flatMapToLong⑥ unordered3、终结操作3.1、短路操…

如何快速升级 Cocos Shader 版本,以简易水shader为例

白背景讲述如何 将一份 3.0.0 版本的水shader 升级至 Cocos Creator 3.6 。希望对大家有所帮助。环境Cocos Creator 3.6.2效果玉此处是鱼&#x1f41f;&#xff0c;介绍如何使用在资源管理器中新建着色器(Effect)复制 文末的 mywater.effect 代码至当前文件在资源管理器中新建材…

Ai绘画生成软件哪个好用?这款AI作画的二次元太精致了

Ai绘画生成软件哪个好用呢&#xff1f;今天小编给大家推荐一款AI作画神器&#xff0c;用它生成的二次元真的是超级惊艳&#xff0c;每天每个手机号可以免费生成多张画作。 我们打开数画ai绘画&#xff0c;这是一款国产软件&#xff0c;使用的是自身研发的算法&#xff0c;目前…

Vue3+TypeScript系统学习(十五) - 详解Vue3 Composition API(二)

前面给大家分享了Options API语法中代码的复用、Options API编码的优缺点&#xff0c;以及setup函数&#xff0c;响应式API等&#xff0c;这次将给大家分享Vue3 Composition API中的计算属性&#xff0c;侦听器&#xff0c;生命周期函数&#xff0c;Provide和Inject等。 1.1 co…

商户绑卡银行卡流程设计优化

一、背景 历史商户系统&#xff0c;断断续续经过好多人开发&#xff0c;商户绑卡流程数据好多地方不同步。 商户绑卡会调用支付平台进行绑卡&#xff0c;但是历史平台将数据留存了一份&#xff0c;所以目前现状&#xff0c;商户平台维护一份数据&#xff0c;支付平台维护一份数…

吴恩达机器学习课程笔记:模型描述、假设函数、代价函数

1.吴恩达机器学习课程笔记&#xff1a;模型描述、假设函数、代价函数 吴恩达机器学习课程笔记&#xff1a;模型描述 吴恩达机器学习课程笔记&#xff1a;代价函数 仅作为个人学习笔记&#xff0c;若各位大佬发现错误请指正 什么是模型&#xff1f; 机器学习模型简单来说&#…

玩转数据结构前言

本章为数据结构学习前的一些学习方法建议 51刷题法 leetcode中文站点: https://leetcode-cn.com leetcode国际站点: https://leetcode.com 刷题方法 Round1 1.读题&#xff0c;思考&#xff0c;4-6分钟内有思路立马写&#xff0c;15分钟内写不出来直接放弃 有思路先别管算…

使用mongostat命令实现zabbix监控mongodb

zabbix监控mongodbmongostat命令监控脚本参考zabbix配置mongostat命令 mongostat是mongodb自带的状态检测工具&#xff0c;可以使用这个命令获取mongodb的当前运行状态&#xff0c;并输出。我们使用这个命令获取mongodb的状态。 本示例中是一个3节点的复制集群&#xff08;一…

调用方系统禁止依赖传递后如何排查本系统所缺少依赖

订单系统依赖了好多其他系统&#xff0c;但当其他系统的service-api的包里依赖项加入了禁止依赖后&#xff0c;订单系统启动就会报错&#xff0c;具体排查那些包被禁止依赖了&#xff0c;方案如下 举例&#xff1a;会员系统后个包加入了禁止依赖<optional>true</opti…

Java中set的基本操作

文章目录1、定义Set2、增删改操作&#xff08;1&#xff09;新增&#xff08;2&#xff09;删出&#xff08;3&#xff09;修改3、访问set4、遍历set&#xff08;1&#xff09;foreach遍历&#xff08;2&#xff09;iterator迭代器遍历5、set转换6、其他操作set是一个无序的集合…

深度解析源码之SpringMVC文件上传为什么要用POST请求还要设置请求头

深度解析源码之SpringMVC文件上传为什么要用POST请求还要设置请求头 从本篇文章开始&#xff0c;来逐步介绍里面每一步的细节处理流程。 首先看到doDispatch方法的第一个重要操作就是校验文件上传请求。代码如下&#xff1a; 这个方法是如何校验文件上传请求的呢&#xff1f;…

软件测试最常用的 SQL 命令 | 通过实例掌握基本查询、条件查询、聚合查询

本文为霍格沃兹测试学院优秀学员学习笔记&#xff0c;汇总了软件测试人员经常使用&#xff0c;必须掌握的 SQL 基础命令1、DML核心CRUD增删改查缩写全称和对应 SQL&#xff1a;* DML 数据操纵语言&#xff1a;Data Manipulation Language* Create 增加&#xff1a;insert* Ret…

工作和学习遇到的技术问题

写在前面 记录工作和学习遇到的技术问题,以求再次遇到可以快速解决。 1&#xff1a;Ubuntu TSL换源报错&#xff1a;Err:1 http://mirrors.aliyun.com/ubuntu focal InRelease 执行如下操作&#xff08;已经操作的则忽略&#xff09;&#xff0c;首先在文件/etc/apt/sources…

Vue.js 数据双向绑定的实现

前言 在我们使用vue的时候&#xff0c;当数据发生了改变&#xff0c;界面也会跟着更新&#xff0c;但这并不是理所当然的&#xff0c;我们修改数据的时候vue是如何监听数据的改变以及当数据发生改变的时候vue如何让界面刷新的&#xff1f; 当我们修改数据的时候vue是通过es5中…

DataGear 制作基于Vue2、Element UI弹窗效果的数据可视化看板

DataGear 在4.4.0版本新增了dg-chart-manual-render特性&#xff0c;用于手动控制看板内图表的渲染&#xff0c;而非在页面加载时自动渲染。利用这一特性&#xff0c;可以很方便制作具有弹窗效果的数据可视化看板。 本文以Vue2、Element UI 前端框架为例&#xff0c;介绍如何制…

【C语言】通讯录—静态版

前言: 刚学完结构体和枚举&#xff0c;在网上找了个通讯录的项目&#xff0c;用来练手 目标:该通讯录可存储千人个人信息 包括:姓名&#xff0c;年龄&#xff0c;性别&#xff0c;电话&#xff0c;地址 实现功能: 1.添加联系人 2.删除联系人 …