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 {
    @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.mfbz.cn/a/207590.html

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

相关文章

作用域和作用域链

前端面试大全JavaScript作用域和作用域链 🌟经典真题 🌟作用域(Scope) 什么是作用域 全局作用域和函数作用域 块级作用域 🌟作用域链 什么是自由变量 什么是作用域链 关于自由变量的取值 🌟作用域…

初识Linux:权限

目录 提示:以下指令均在Xshell 7 中进行 Linux 的权限 内核: 查看操作系统版本 查看cpu信息 查看内存信息 外部程序: 用户: 普通用户变为超级用户: su 和 su-的区别: root用户变成普通用户&#…

【matlab程序】画海洋流场

【matlab程序】画海洋流场 clear;clc; file ( ‘0227.nc’); latncread(file,‘latitude’); lonncread(file,‘longitude’); uncread(file,‘water_u’); vncread(file,‘water_v’); [x,y]meshgrid(lon,lat); xx’; yy’; interval4; figure (1) set(gcf,‘color’,[1 1 1…

【linux】基本指令(上篇)

1.快速认识5~6个指令 pwd指令 ls指令 touch指令 cd指令 clear指令 touch指令 详细讲解 首先有一个问题就是当我们创建一个文件,但是没有往里面写内容,那么磁盘上会有该文件吗? 磁盘上会保存,因为创建好的文件,没有…

【古月居《ros入门21讲》学习笔记】05_ROS是什么及其核心概念

目录 说明 1. ROS发展史 ROS版本演变 2. ROS是什么 ROS中的通信机制 ROS中的开发工具 ROS中的应用功能 ROS中的生态系统 3. ROS核心概念 节点与节点管理器 通信方式1:话题 通信方式2:服务 话题与服务的区别 参数 文件系统 说明 1. 本系列…

学习笔记7——数据库基础知识以及mysql的查询语句

学习笔记系列开头惯例发布一些寻亲消息 链接:https://baobeihuijia.com/bbhj/contents/3/199913.html 数据库 三个概念区分 DB:数据库,存储数据的仓库,有组织的数据容器DBMS:数据库管理系统SQL:几乎所有的DBMS都支持…

从PDF和图像中提取文本,以供大型语言模型使用

想法 大型语言模型已经席卷了互联网,导致更多的人没有认真关注使用这些模型最重要的部分:高质量的数据!本文旨在提供一些有效从任何类型文档中提取文本的技术。 Python库 本文专注于Pytesseract、easyOCR、PyPDF2和LangChain库。实验数据是一…

jQuery的使用

目录 jquery对象&#xff1a; jquery作为一般函数调用参数: jquery事件机制 jquery dom操作 jquery对象&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" cont…

MySQL 教程 1.4

MySQL 连接 使用mysql二进制方式连接 您可以使用MySQL二进制方式进入到mysql命令提示符下来连接MySQL数据库。 实例 以下是从命令行中连接mysql服务器的简单实例&#xff1a; [roothost]# mysql -u root -p Enter password:****** 在登录成功后会出现 mysql> 命令提示窗…

Python全栈之基本数据类型详解

文章目录 1.注释2.输出3.变量4.命名规范5.变量的定义方式1.字符串类型2.数字类型3.List列表类型4.tuple 元组类型的定义5.Dict字典类型6.set集合类型7.数据类型转换8.自动类型转换9.强制类型转换关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品…

Reactor网络线程模型

目录 传统下网络服务模型 事件监听模型 NIO核心概念 单线程Reactor模式 多线程Reactor模式 Kafka 的网络设计 主要概念 类比思维理解 参考文章 传统下网络服务模型 线程太多无法处理大规模请求 事件监听模型 NIO核心概念 nio是实现reactor模式的底层API代码 单…

【SparkSQL】SparkSQL函数定义(重点:定义UDF函数、使用窗口函数)

【大家好&#xff0c;我是爱干饭的猿&#xff0c;本文重点介绍SparkSQL 定义UDF函数、SparkSQL 使用窗口函数。 后续会继续分享其他重要知识点总结&#xff0c;如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下吧】 上一篇文章&#xff1a;《【SparkSQL…

C++相关闲碎记录(2)

1、误用shared_ptr int* p new int; shared_ptr<int> sp1(p); shared_ptr<int> sp2(p); //error // 通过原始指针两次创建shared_ptr是错误的shared_ptr<int> sp1(new int); shared_ptr<int> sp2(sp1); //ok 如果对C相关闲碎记录(1)中记录的shar…

【前缀和]LeetCode1862:向下取整数对和

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 作者推荐 动态规划LeetCode2552&#xff1a;优化了6版的1324模式 题目 给你一个整数数组 nums &#xff0c;请你返回所有下标对 0 < i, j < nums.length 的 …

一文带你了解网络安全简史

网络安全简史 1. 上古时代1.1 计算机病毒的理论原型1.2 早期计算机病毒1.3 主要特点 2. 黑客时代2.1 计算机病毒的大流行2.2 知名计算机病毒2.3 主要特点 3. 黑产时代3.1 网络威胁持续升级3.2 代表性事件3.3 主要特点 4 高级威胁时代4.1 高级威胁时代到来4.2 著名的APT组织4.3 …

Python之Requests模块简介与安装

Requests模块简介 在python的标准库中&#xff0c;虽然提供了urllib,utllib2,httplib&#xff0c;但是做接口测试&#xff0c;requests使用更加方便快捷&#xff0c;正如官方说的&#xff0c;“让HTTP服务人类”。 Requests是用python语言基于urllib编写的&#xff0c;采用的是…

利用异或、取反、自增bypass_webshell_waf

目录 引言 利用异或 介绍 eval与assert 蚁剑连接 进阶题目 利用取反 利用自增 引言 有这样一个waf用于防御我们上传的文件&#xff1a; function fun($var): bool{$blacklist ["\$_", "eval","copy" ,"assert","usort…

折扣因子的变化图(Python)

var 3 var_list [3] for _ in range(50):var * .95var_list.append(var)import matplotlib.pyplot as plt import numpy as np plt.plot(np.arange(len(var_list)), var_list, linewidth1) plt.show()

美丽的时钟

案例绘制一个时钟 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>美丽的时钟</title><script language"javascript">window.onloadfunction(){var clockdocument.getElementById("clock"…

你需要知道所有设计模式吗?

后续我会详细展开设计模式 &#x1d5d7;&#x1d5fc; &#x1d5ec;&#x1d5fc;&#x1d602; &#x1d5e1;&#x1d5f2;&#x1d5f2;&#x1d5f1; &#x1d5e7;&#x1d5fc; &#x1d5de;&#x1d5fb;&#x1d5fc;&#x1d604; &#x1d5d4;&#x1d5f9;&…