Spring简单的存储和读取

前言

前面讲了spring的创建,现在说说关于Bean和五大类注解


一、Bean是什么?

在 Java 语⾔中对象也叫做 Bean,所以后⾯咱们再遇到对象就以 Bean 著称。这篇文章还是以spring创建为主。

二、存储对象

2.1 俩种存储方式

需要在 spring-config 中添加⼀⾏ bean 注册内容
在这里插入图片描述
第二种是扫描路径,像我这样子直接扫描包

三.类注解:

@Controller:表示的是业务逻辑层;
@Servie:服务层;
@Repository:持久层;
@Component(组件存储);
@Configuration:配置层。

3.1 为什么要这么多类注解?

为什么需要怎么多的类注解也是相同的原因,就是让程序员看到类注解之后,就能直接了解当前类
的⽤途,
程序的⼯程分层,调⽤流程如下:
在这里插入图片描述

3.2类注解之间的联系:

查看源码发现,源码内部都有@Component,说明它们本身就是属于 @Component 的“⼦类”

3.3命名规则

通常我们 bean 使⽤的都是标准的⼤驼峰命名,⽽读取的时候⾸字⺟⼩写就可以获取到 bean 了

在这里插入图片描述

而Bean对象命名的规则是使⽤的是 JDK Introspector 中的 decapitalize ⽅法,大致意思是
如果第⼀个字⺟和第⼆个字⺟都为⼤写的情况,是把 bean 的⾸字⺟也⼤写存储了,否则就将⾸字⺟⼩写。

3.3.2不涉及强转类型写法
在这里插入图片描述


3.4方法注解@Bean

类注解是添加到某个类上的,⽽⽅法注解是放到某个⽅法上的,在 Spring 框架的设计中,⽅法注解 @Bean 要配合类注解才能将对象正常的存储到 Spring 容器中,一般是和***@Component搭配***一般来说只有在返回类型是一个对象的时候才用bean,否则可以不用
在这里插入图片描述

3.5重命名Bean

这个重命名的 name 其实是⼀个数组,⼀个 bean 可以有多个名字
在这里插入图片描述
并且 name={} 可以省略,如下代码所示:
在这里插入图片描述

四.获取Bean对象

4.1属性注入

属性注⼊是使⽤ @Autowired 实现的,将 Service 类注⼊到 Controller 类中

package com.java.demo.dao;import org.springframework.stereotype.Repository;@Repository
public class UserRepository {public int add(){System.out.println("Do the UserRepository");return 1;}
}
package com.java.demo.Service;
import com.java.demo.dao.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;@Service
public class UserService {@Autowired //DI(依赖注入)private UserRepository userRepository;//传统public int add(){System.out.println("do userservice");
//        UserRepository  userRepository = new UserRepository();
//        return userRepository.add();
//        //spring 1.0
//        ApplicationContext context =
//                new ClassPathXmlApplicationContext("spring.config.demo");
//        UserRepository userRepository = context.getBean("userRepository",UserRepository.class);
//        return userRepository.add();return userRepository.add();}}

这其中被注解的分别是实例化一个对象和spring的写法,但其实我觉得@Autowired就是理解成了new了一个新对象,只不过写法更加简单。

4.2构造方法注入

public interface UserService {void createUser(String username);
}@Service
public class UserServiceImpl implements UserService {@Overridepublic void createUser(String username) {// 实际创建用户的业务逻辑System.out.println("Creating user: " + username);}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;@Controller
public class UserController {private final UserService userService;// 构造方法注入@Autowiredpublic UserController(UserService userService) {this.userService = userService;}@GetMapping("/createUser")public String createUser(@RequestParam String username) {// 调用 UserService 创建用户userService.createUser(username);// 返回视图名称(可以根据实际情况返回具体的视图)return "userCreated";}
}

4.3setter注入

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;@Controller
public class UserController {private UserService userService;// 使用setter方法进行依赖注入@Autowiredpublic void setUserService(UserService userService) {this.userService = userService;}@GetMapping("/createUser")public String createUser(@RequestParam String username) {// 调用 UserService 创建用户userService.createUser(username);// 返回视图名称(可以根据实际情况返回具体的视图)return "userCreated";}
}

在这里,我们使用@Autowired注解在setUserService方法上,告诉Spring框架将UserService的实例注入到UserController中。

然后,你可以在Application类中调用main方法,以启动整个应用程序。这部分的代码和之前的例子类似,不再赘述。

使用setter注入的优势在于,它允许在运行时动态更改依赖。但是,在实践中,通常在构造方法注入和setter注入之间进行选择时,更推荐使用构造方法注入,因为它能够更好地确保依赖的完整性,并且使得类的状态在实例化之后就是不可变的。
我浅浅总结一下;构造方法注入可以多参数,不能为空,setter注入只能单个参数,并且可以为空

注意事项;
但是如果类中有多个构造⽅法,那么需要添加上 @Autowired 来明确指定到底使⽤哪个构造⽅法,否则程序会报错,单个构造方法可以不用

4.5 @Resource:另⼀种注⼊关键字

在进⾏类注⼊时,除了可以使⽤ @Autowired 关键字之外,我们还可以使⽤ @Resource 注入。
出身不同:
1.@Autowired 来⾃于 Spring,⽽ @Resource 来⾃于 JDK 的注解;
2.使⽤时设置的参数不同:相⽐于 @Autowired 来说,@Resource ⽀持更多的参数设置,例如
name 设置,根据名称获取 Bean。
3.@Autowired 可⽤于 Setter 注⼊、构造函数注⼊和属性注⼊,⽽ @Resource 只能⽤于 Setter 注
⼊和属性注⼊,不能⽤于构造函数注⼊。

而如果当我们的出现以下多个 Bean,返回同⼀对象类型时程序会报错:
在这里插入图片描述

原因就是非唯一的bean
解决方法:
使⽤ @Resource(name=“user1”) 定义。
使⽤ @Qualifier 注解定义名称。

总结

今天blog就到这里了,希望三连+评论啊

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

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

相关文章

A++ 敏捷开发-1 如何改善

1 如何改善 敏捷开发过程改进案例 5月 A公司一直专门为某电信公司提供针对客服、线上播放等服务服务。 张工是公司的中层管理者,管理好几个开发团队,有5位项目经理向他汇报。 他听说老同学的团队都开始用敏捷开发,很感兴趣,便参…

kafka中的常见问题处理

文章目录 1. 如何防⽌消息丢失2. 如何防⽌重复消费3. 如何做到消息的顺序消费4. 如何解决消息积压问题4.1 消息积压问题的出现4.2 消息积压的解决⽅案 5. 实现延时队列的效果5.1 应用场景5.2 具体方案 1. 如何防⽌消息丢失 ⽣产者:1)使⽤同步发送 2&…

C语言——有一个3*4的矩阵,要求求出其中值最大的那个元素的值,以及其所在的行号和列号

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int i,j,row0,colum0,a[3][4]{{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};int maxa[0][0];for ( i 0; i < 3; i)//行&#xff08;row&#xff09;{for ( j 0; j < 4; j)//列&#xff08;colum&#xf…

Microsoft Remote Desktop高效、安全、稳定的远程办公解决方案

在今天的数字化时代&#xff0c;Remote Desktop远程办公已成为许多人的日常生活。无论你是因为工作需要&#xff0c;还是因为在家中需要访问公司服务器&#xff0c;微软远程连接软件都是一个理想的选择。 微软远程连接软件Remote Desktop是一款高效、安全、稳定的远程办公解决…

sublime Text使用

1、增加install 命令面板 工具(tool)->控制面板(command palette) -> 输入install ->安装第一个install package controller&#xff0c;以下安装过了&#xff0c;所以没展示 2、安装json格式化工具 点击install package&#xff0c;等几秒会进入控制面板&#xff0…

R语言30分钟上手

文章目录 1. 环境&安装1.1. rstudio保存工作空间 2. 创建数据集2.1. 数据集概念2.2. 向量、矩阵2.3. 数据框2.3.1. 创建数据框2.3.2. 创建新变量2.3.3. 变量的重编码2.3.4. 列重命名2.3.5. 缺失值2.3.6. 日期值2.3.7. 数据框排序2.3.8. 数据框合并(合并沪深300和中证500收盘…

B 树和 B+树 的区别

文章目录 B 树和 B树 的区别 B 树和 B树 的区别 了解二叉树、AVL 树、B 树的概念 B 树和 B树的应用场景 B 树是一种多路平衡查找树&#xff0c;为了更形象的理解。 二叉树&#xff0c;每个节点支持两个分支的树结构&#xff0c;相比于单向链表&#xff0c;多了一个分支。 …

WSL2 docker GUI 界面

在 WSL2 docker 中运行GUI界面。 具体流程和远程显示Ubuntu界面类似&#xff0c;链接, 更简单一点&#xff0c; 少了 ssh 的部分。 安装好wsl2 和 docker wsl2 运行GUI程序&#xff0c;windows 会默认弹出窗口。 可以安装 gedit 测试一下 windows 下载并运行 Xlaunch. 运行 d…

(二) Windows 下 Sublime Text 3 安装离线插件 Anaconda

1 下载 Sublime Text 3 免安装版 Download - Sublime Text 2 下载 Package Control&#xff0c;放到 Sublime Text Build 3211\Data\Installed Packages 目录下。 Installation - Package Control 3 页面搜索 anaconda anaconda - Search - Package Control Anaconda - Pac…

python opencv -模板匹配

python opencv -模板匹配 模板匹配就是&#xff0c;我们现有一个模板和一个图片&#xff0c;然后&#xff0c;在这个图片中寻找和模板近似的部分。 在opencv 中主要通过cv2.matchTemplate这个函数去实现。 下面我们先看一下&#xff0c;模板图片和需要匹配的图片&#xff1a…

HTML-标签之文字排版、图片、链接、音视频

1、标签语法 HTML超文本标记语言——HyperText Markup Language 超文本是链接标记也叫标签&#xff0c;带尖括号的文本 2、HTML基本骨架 HTML基本骨架是网页模板 html&#xff1a;整个网页head&#xff1a;网页头部&#xff0c;存放给浏览器看的代码&#xff0c;例如CSSbody…

计算机网络——数据链路层

目录 一、数据链路层的基本概念 &#xff08;一&#xff09;数据链路层的概念 &#xff08;二&#xff09;帧 &#xff08;三&#xff09;数据链路层分为哪两个部分 &#xff08;1&#xff09;LLC&#xff08;逻辑控制访问&#xff09; &#xff08;2&#xff09;MAC&…

入侵redis之准备---VMware上面安装部署centos7镜像系统【详细含云盘镜像】

入侵redis之准备—VMware上面安装部署centos7镜像系统【详细含云盘镜像 其他文章&#xff1a; 入侵redis并实现反弹shell控制【实战一】 学习大概步骤如下 第一步:先学习怎么安装部署kail系统服务器 入侵redis之准备—VMware安装部署kail镜像服务器【详细包含云盘镜像】 第二…

【论文阅读】1 SkyChain:一个深度强化学习的动态区块链分片系统

SkyChain 一、文献简介二、引言及重要信息2.1 研究背景2.2 研究目的和意义2.3 文献的创新点 三、研究内容3.1模型3.2自适应分类账协议3.2.1状态块创建3.2.2合并过程3.2.3拆分过程 3.3评价框架3.3.1性能3.3.1.1共识延迟3.3.1.2重新分片延迟3.3.1.3处理事务数3.3.1.4 约束 3.3.2 …

以太网PHY,MAC接口

本文主要介绍以太网的 MAC 和 PHY&#xff0c;以及之间的 MII&#xff08;Media Independent Interface &#xff0c;媒体独立接口&#xff09;和 MII 的各种衍生版本——GMII、SGMII、RMII、RGMII等。 简介 从硬件的角度看&#xff0c;以太网接口电路主要由MAC&#xff08;M…

快速了解ChatGPT(大语言模型)

目录 GPT原理&#xff1a;文字接龙&#xff0c;输入一个字&#xff0c;后面会接最有可能出现的文字。 GPT4 学会提问&#xff1a;发挥语言模型的最大能力 参考李宏毅老师的课快速了解大语言模型做的笔记&#xff1a; Lee老师幽默的开场&#xff1a; GPT&#xff1a;chat Ge…

在cmd下查看mysql表的结构信息

我提前已经在mysql数据库中创建了一个表&#xff1a; 在cmd下&#xff0c;登录mysql以后&#xff0c;使用命令describe 表名、或者explain 表名可以查看表结构信息。但在实践中&#xff0c;查看表结构&#xff0c;多用describe命令&#xff0c;而查看执行计划用explain。 例…

Yolov8实现瓶盖正反面检测

一、模型介绍 模型基于 yolov8n数据集采用SKU-110k&#xff0c;这数据集太大了十几个 G&#xff0c;所以只训练了 10 轮左右就拿来微调了 基于原木数据微调&#xff1a;训练 200 轮的效果 10 轮SKU-110k 20 轮原木 200 轮瓶盖正反面 微调模型下载地址https://wwxd.lanzouu.co…

西工大网络空间安全学院计算机系统基础实验零

首先&#xff0c;下载VMware17 Pro workstation。为什么要下载VMware17 Pro workstation呢&#xff1f;因为计算机系统基础实验有四个大部分&#xff1a;利用位运算实现诸如a*b&#xff0c;a/b&#xff0c;a*(2^4)等运算&#xff1b;C语言循环语句、switch语句等语句与汇编代码…

Android 12 及以上授权精确位置和模糊位置

请求位置信息权限 为了保护用户隐私&#xff0c;使用位置信息服务的应用必须请求位置权限。 请求位置权限时&#xff0c;请遵循与请求任何其他运行时权限相同的最佳做法。请求位置权限时的一个重要区别在于&#xff0c;系统中包含与位置相关的多项权限。具体请求哪项权限以及…