Spring简单的存储和读取

news2025/1/12 21:02:09

前言

前面讲了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 {
    @Override
    public 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;

    // 构造方法注入
    @Autowired
    public 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方法进行依赖注入
    @Autowired
    public 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.coloradmin.cn/o/1274594.html

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

相关文章

借助ETL快速查询金蝶云星空表单信息

随着数字化转型的加速,企业信息化程度越来越高,大量的数据产生并存储在云端,需要进行有效的数据管理和查询。金蝶云星空是金蝶云旗下的一款云ERP产品,为企业提供了完整的业务流程和数据管理功能,因此需要进行有效的数据…

使用 CSS Grid 的响应式网页设计:消除媒体查询过载

文章目录 前言介绍 CSS Grid让我们开始吧实现高级响应性1、Repeat() 2、Auto-fit3、Minmax()结论 前言 你是否厌倦了在实现响应式网站时需要管理多个媒体查询?说再见复杂的代码,拥抱更简单的解决方案吧:CSS Grid。 在这篇文章中,…

血的教训---入侵redis并免密登录redis所在服务器漏洞复现

血的教训—入侵redis并免密登录redis所在服务器漏洞复现 今天就跟着我一起来入侵redis并免密登录redis所在服务器吧,废话不多说,我们直接开始吧。 这是一个体系的学习步骤,当然如果基础扎实的话可以继续往下面看 以下都是关联的文章&#xff…

MobaXterm连接相关

其实最终解决的方法,还是,因为要远程连接的是个局域网ip,我所在的ip和要连接的这个不在同一个局域网内,需要实验室搭的VPN才行。 甚至,我连防火墙都没关,也可以连接 至于修改密码,passwd&#…

应用于智慧金融的AI边缘计算盒子+AI算法软硬一体化方案

传统金融营业厅存在运营管理模式落后、资源投放不平衡、从业人员培训效果不达预期、客户体验割裂等普遍现象; 部署英码数字金融解决方案,将助力企业从传统金融模式快速向数字金融模式转变,可针对每一个客户定制个性化“一对一”服务&#xff…

算法与数据结构有区别吗?

算法和数据结构并不是同一件事。严格来说,它们并不是等效的。但是,我们通常在使用的时候会互换这两个术语。为了简便,后文我们会用数据结构这个术语来指代“数据结构及其所有相关的方法”。 有很多方法可以用来说明这两个术语之间的区别&…

Linux信号超详细剖析

预备知识: 一、信号产生(OS发给进程) 1、键盘组合键 Linux中,一次登录对应一个终端,bash/shell。且只允许一个进程是前台进程,默认就是bash/shell,其它都是后台进程。获取键盘输入的是前台进程。 Ctrlc: 向前台进程…

Nginx配置文件全解析【深度剖析细节】

文章目录 💥 简介💫 基本结构🍉 事件处理器🥭 配置分析🍏 配置示例 🍉 HTTP服务器🥭 配置分析🍏 配置示例 🍉 虚拟主机 🍊 优化🍔 总结 &#x1f…

02-使用Git命令操作远程仓库,如克隆或添加远程仓库,拉取或推送内容

操作远程仓库 创建远程仓库 第一步: 访问GitHub官网,登录自己的账号创建一个远程仓库 第二步: 设置远程仓库的信息(一般远程库的名字和本地库的名字一样),仓库创建完成后可以看到仓库地址(每个仓库都会对应一个网络地址) 第三步: 查看本地仓库对应的Https/SSH连接 远程仓库命…

【负载均衡 SLB介绍及其算法详解】(一万两千字)

目录 一、负载均衡 SLB 定义 二、负载均衡SLB的作用 三、负载均衡器(Load Balancer) 【1】工作原理 【2】主要功能 【3】关键概念 四、工作负载(Workload) 五、负载均衡算法 【1】轮询(Round Robin&#xff0…

Oracle(2-8)Configuring the Database Archiving Mode

文章目录 一、基础知识1、Redo Log History2、NOARCHIVELOG Mode 非归档模式3、ARCHIVELOG Mode 归档模式4、Changing the Archiving Mode 更改归档模式![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d6a09f9a6de24de7bbcdad90b8d6b9ca.png)5、Auto and Manual Ar…

图扑参展高交会-全球清洁能源创新博览会

“相聚鹏城深圳,共享能源盛宴” 第二十五届中国国际高新技术成果交易会(简称“高交会”)于 11 月 15-18 日在深圳盛大开幕。高交会由商务部、科学技术部、工业和信息化部、国家发展改革委、农业农村部、国家知识产权局、中国科学院、中国工程院和深圳市人民政府共同…

从零开始Inline Hook

中断表进入0环 通过中断门进入0环&#xff0c;首先了解一下中断门的构成 构造一个中断号 Base:函数地址 DPL:3 //因为三环使用调用门的条件就是CPL(即cs段选择子的RPL)<DPL P:1 //P为1时&#xff0c;中断表才有效 Segment Selector: 0x0008 //中断成功后切换自己的CPL 在…

生产制造中4种导致产品成本、库存核算差错的问题!(化工/化妆品/生物制剂/混凝土等行业ODOO)

在化工/化妆品/生物制剂/混凝土等行业&#xff0c;因为其生产物料及产成品大都以液体&#xff08;或散颗粒&#xff09;形态为主&#xff0c;多以重量为计数方式&#xff1b;且液体&#xff08;或散颗粒&#xff09;相较于固体的较大区别就是产品计数上变数较大&#xff0c;固体…

“掌握速卖通平台接口:电商开发的技术巅峰“

一、概述 速卖通平台接口是全球速卖通提供的一套API接口&#xff0c;旨在为开发者提供与速卖通平台进行数据交互的能力。通过使用速卖通平台接口&#xff0c;开发者可以快速构建自己的电商应用程序&#xff0c;并实现与速卖通平台的数据共享和交易流程。本文将详细介绍速卖通平…

List集合,遍历,数据结构

一.List常见的方法&#xff1a; 二. List集合的遍历方式 除了 迭代器遍历 增强for遍历 Lambda表达式遍历&#xff0c;还有自己独有的普通for遍历&#xff0c;列表迭代器遍历 1.迭代器遍历 2.增强for遍历 3.Lambda表达式遍历 4.普通for遍历 5.列表迭代器遍历 列表迭代器相对于…

云计算生成式 -给你不一样的音乐推荐新体验

目录 摘要&#xff1a; 正文&#xff1a; 一、亚马逊云与生成式 AI 结合的展望/总结 二、我用亚马逊云科技生成式 AI 产品打造了什么&#xff0c;解决了什么问题 三、未来云端技术发展趋势的见解 四、云端技术未来需要解决的问题 1、如何保护数据安全和隐私&#xff1f; …

SQL Sever 复习笔记【一】

SQL Sever 基础知识 一、查询数据第1节 基本 SQL Server 语句SELECT第2节 SELECT语句示例2.1 SELECT - 检索表示例的某些列2.2 SELECT - 检索表的所有列2.3 SELECT - 对结果集进行筛选2.4 SELECT - 对结果集进行排序2.5 SELECT - 对结果集进行分组2.5 SELECT - 对结果集进行筛选…

企业选择通配符SSL证书

通配符SSL数字证书是CA认证机构签发较多的一款SSL证书&#xff0c;它可以保护一个域名及其所有子域名&#xff0c;并且在证书有效期内可以免费添加子域名。对于子域名较多或者想要创建子域名站点的个人或者企事业单位&#xff0c;通配符SSL证书是性价比较高的一个选择。这种证书…

element ui el-date-picker日期时间选择器 设置只能选择不大于30天时间范围

需求&#xff1a;要求日期时间选择器只能选择最多32天&#xff0c;其他日期为不可点击状态。 日期组件type为daterange或者datetimerange都生效 实现&#xff08;vue2.x&#xff09;&#xff1a; 通过属性picker-options html <el-date-pickerv-model"dateTime&qu…