Spring---更简单的存储和读取对象

文章目录

  • 存储Bean对象
    • 配置扫描路径
    • 添加注解存储Bean对象
      • 使用类注解
          • 为什么需要五个类注解呢?
          • Bean命名规则
      • 使用方法注解
          • 重命名Bean
  • 读取Bean对象
    • 属性注入
    • Setter注入
    • 构造方法注入
    • 注入多个相同类型的Bean
    • @Autowired vs @Resource

存储Bean对象

配置扫描路径

在这里插入图片描述

注:

  1. 只有在扫描路径下的所有类,添加了注解才能被正确的识别并保存到 Spring 中
  2. 即使添加了注解,但是该类不在扫描路径下也是不能被保存到 Spring 中的

添加注解存储Bean对象

使用注解把 Bean 对象存储到 Spring 中,有两种注解类型可以选择:类注解 和 方法注解,我们下面分别来介绍:

使用类注解

//一共有五种类注解可以进行对象的注册:@Controller
public class ArticleController {public String sayHello(){return "hello,controller";}
}@Service
public class UserService {public String sayHello(){return "hello,service";}
}@Repository
public class UserRepository {public String sayHello(){return "hello,repository";}
}@Configuration
public class UserConfiguration {public String sayHello(){return "hello,configuration";}
}@org.springframework.stereotype.Component
public class Component {public String sayHello(){return "hello,component";}
}
//先使用上下文的方式来获取对象,下面介绍更简单的获取对象的方式://当使用5大类注解获取bean时,默认 只需要将类名首字母小写即可,  如果bean对象的首字母和第二个字母都是大写时,需要使用原类名才能正确获取到bean对象ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");ArticleController articleController = context.getBean("articleController",ArticleController.class);System.out.println(articleController.sayHello());UserService userService = context.getBean("userService",UserService.class);System.out.println(userService.sayHello());UserRepository userRepository = context.getBean("userRepository",UserRepository.class);System.out.println(userRepository.sayHello());Component component = context.getBean("component",Component.class);System.out.println(component.sayHello());UserConfiguration userConfiguration = context.getBean("userConfiguration",UserConfiguration.class);System.out.println(userConfiguration.sayHello());
为什么需要五个类注解呢?

在这里使用五个类注解,是为了让程序员看到类注解之后就能直接了解到当前类的用途,不同的类注解的用途是不同的:

  • @Controller:表示业务逻辑层
  • @Service:表示服务层
  • @Repository:表示持久层
  • @Configuration:表示配置层
  • @Component:表示组件

在这里插入图片描述

注:@Component注解是其他四个注解的父类

Bean命名规则

我们配置扫描路径来注册 Bean 对象时并没有设置对象的 id ,那我们通过上下文的方式来获取对象时该使用什么 id 呢?

//我们查看Spring的源码来获取答案:public static String decapitalize(String name) {if (name == null || name.length() == 0) {return name;}// 如果第⼀个字⺟和第⼆个字⺟都为⼤写的情况,是把 bean 的⾸字⺟也⼤写存储了if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&Character.isUpperCase(name.charAt(0))){return name;}// 否则就将⾸字⺟⼩写char chars[] = name.toCharArray();chars[0] = Character.toLowerCase(chars[0]);return new String(chars);
}

注:通过源码我们可以知道:

  1. 我们通过上下文获取对象的时候,直接使用类名作为 id 即可
  2. 默认情况下,直接将类名的首字母小写作为 id 使用即可;如果类名的首字母和第二个字母都是大写时,需要使用原类名作为 id 使用。

使用方法注解

@Component
public class StudentBeans {@Beanpublic Student student(){Student student = new Student();student.setId(1);student.setName("张三");student.setAge(18);return student;}
}

注:

  1. 类注解是添加到某个类上的;方法注解是添加到某个方法上的。
  2. 方法注解要搭配五大类注解一起使用
  3. 方法注解是为了解决不能多次注册同一个类的问题
重命名Bean
@Component
public class StudentBeans {@Bean(name = {"s1","s2"})public Student student(){Student student = new Student();student.setId(1);student.setName("张三");student.setAge(18);return student;}
}

注:

  1. 重命名Bean后,使用Spring上下文来获取对象时,必须把重命名后的名字作为 id 来使用
  2. 方法注解重命名Bean后解决了不能多次注册同一个类的问题

读取Bean对象

我们通过 Spring 注入的方式来更加简单的获取 Bean 对象,一共有三种注入方式:

属性注入

    @Autowiredprivate StudentService studentService;

优点:使用简单
缺点:

  1. 不能注入不可变对象(final对象),因为final类型的变量在调用class的构造函数的这个过程当中就得初始化完成,基于字段的注入是使用set形式注入的
  2. 只适用于Ioc容器
  3. 更容易违背单一设计原则:针对类级

Setter注入

    private StudentService studentService;@Autowiredpublic void setStudentService(StudentService studentService){this.studentService = studentService;}

优点:更符合单一设计原则:针对方法级别
缺点:

  1. 不能注入不可变对象(final对象),因为final类型的变量在调用class的构造函数的这个过程当中就得初始化完成,基于字段的注入是使用set形式注入的
  2. 注入对象可被修改

构造方法注入

	private StudentService studentService;//当类中只有一个构造方法时   @Autowired可以省略//如果类中有多个构造方法(重载)时,需要加上@Autowired来明确使用哪个构造方法来注入对象@Autowiredpublic StudentController(StudentService studentService){this.studentService = studentService;}

优点:

  1. 可以注入一个不可变对象(final对象)
  2. 注入的对象可以被修改(可以被final修饰、构造方法只执行一次)
  3. 注入的对象会被完全初始化
  4. 通用性更好

缺点:没有属性注入简单

注入多个相同类型的Bean

注入多个相同类型的 Bean 对象,有两种解决方案:

  • 使用@Resource(name=“ ”)
	@Resource(name="student1")private Student student1;@Resource(name="student2")private Student student2;
  • 使用@Autowired + @Qualifier(value=“ ”)
	@Autowired@Qualifier(value="student1")private Student student1;@Autowired@Qualifier(value="student2")private Student student2;

@Autowired vs @Resource

相同点:都是用来实现依赖注入的
不同点:

  1. 功能支持不同。@Autowired支持属性注入、setter注入、构造方法注入;而@Resource支持属性注入、setter注入却不支持构造方法注入
  2. 出身不同:@Autowired来自于Spring框架;@Resource来自于JDK
  3. 参数支持不同:@Autowired只支持required参数;@Resource支持更多的参数设置
  4. 依赖识别方式不同:@Autowired默认是以 byType 的方式。也可以使用 @Qualifier 指定 Bean的名称转用 byName 的方式;@Resource默认是以 byName 的方式,当 byName方式无法匹配时,会使用 byType方式

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

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

相关文章

maven下载和安装

maven下载和安装 一、概述 Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来…

conda环境下 ERROR: CMake must be installed to build dlib问题解决

1 问题描述 在构建video_retalking项目过程中,使用命令安装依赖包时,运行依赖安装命令: pip install -r requirements.txt 出现如下错误: Building wheels for collected packages: face-alignment, dlib, ffmpy, futureBuil…

【HuggingFace Transformer库学习笔记】基础组件学习:Tokenizer

基础组件——Tokenizer (1)模型加载 from transformers import AutoTokenizersen "弱小的我也有大梦想!" # 从HuggingFace加载,输入模型名称,即可加载对于的分词器 tokenizer AutoTokenizer.from_pretrained("m…

〖大前端 - 基础入门三大核心之JS篇㊸〗- DOM事件对象及它的属性

说明:该文属于 大前端全栈架构白宝书专栏,目前阶段免费,如需要项目实战或者是体系化资源,文末名片加V!作者:不渴望力量的哈士奇(哈哥),十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

【稳定检索|投稿优惠】2024年生物神经工程与健康大数据国际会议(ICBNHBD 2024)

2024年生物神经工程与健康大数据国际会议(ICBNHBD 2024) 2024 International Conference on Biological Neuroengineering and Health Big Data(ICBNHBD) 一、【会议简介】 2024年生物神经工程与健康大数据国际会议(ICBNHBD 2024),这场科学盛宴,会议在中…

rtsp点播异常出现‘circluar_buffer_size‘ option was set but it is xx

先说现象: 我使用potplay播放器来点播rtsp码流的时候可以点播成功,同事使用vlc和FFplay来点播rtsp码流的时候异常。 排查思路: 1.开始怀疑是oss账号问题,因为ts切片数据是保存在oss中的,我使用的是自己的oss账号,同事使用的是公司…

Azure Machine Learning - 使用 REST API 创建 Azure AI 搜索索引

本文介绍如何使用 Azure AI 搜索 REST AP和用于发送和接收请求的 REST 客户端以交互方式构建请求。 关注TechLead,分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员&…

Python 安装mysqlclient 错误 无法打开包括文件: “mysql.h”: 解决方法

解决方案:python最新3.12.0不支持mysqlclient 请下载 python3.9.9 版本 高速下载地址CNPM Binaries Mirror 官方下载地址Welcome to Python.org 下载完成后将python添加到环境变量 pycharm 虚拟环境下的python版本切换到你刚才下载的3.9.9的python版本 Avai…

C++动态内存管理new,delete

C动态内存管理new,delete 1.C/C内存分布2.C语言中的内存管理方式3.C中的内存管理方式new,delete3.1C中的内置类型new,delete3.2new,delete操作自定义类型3.3 new和delete匹配 4. operator new与operator delete函数4.1new和delete…

反转链表的实现

题目描述: 给出一个链表的头节点,将其反转,并返回新的头节点 思路1:反转地址 将每个节点里的地址由指向下一个节点变为指向前一个节点 定义三个结构体指针n1,n2,n3,n1表示改后指针的地址,n2表示要修改结构体里next的…

PT读spef报PARA-006如何解决?

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 There are multiple causes that can trigger PARA-006 errors. Here is a checklist. 1) SPEF reading order Functionally, the parasitic files can be read in any order. For best stitching…

百度飞桨(张江)人工智能产业赋能中心入驻申请

中心如何赋能 百度飞桨(张江)人工智能产业赋能中心是浦东“大企业开放创新中心计划”首批企业代表,百度和张江集团将联合为入驻初创企业及生态合作伙伴提供以下服务: 降低AI使用门槛 通过“百度飞桨人工智能公共技术平台”&#x…

解决git与huggingface项目下载速度慢或者失败的问题

git clone 项目报错 比如使用git clone 下载项目: git clone https://github.com/ChuRuaNh0/FastSam_Awsome_TensorRT.git有时候会报以下错误: fatal: unable to access ‘https://github.com/xxx.git/’: Failed to connect to github.com port 443 …

[读论文]meshGPT

概述 任务:无条件生成mesh (无颜色)数据集:shapenet v2方法:先trian一个auto encoder,用来获得code book;然后trian一个自回归的transformermesh表达:face序列。face按规定的顺序&a…

大型网站系统架构演化(Web)

大型网站系统架构演化 大型网站系统架构演化需要关注的维度涉及的技术演进过程单体架构垂直架构使用缓存改善网站性能缓存与数据库的数据一致性问题缓存技术对比Redis分布式存储方案Redis集群切片的常见方式Redis数据类型Redis 淘汰算法使用服务集群改善网站并发能力 大型网站系…

Python实现FA萤火虫优化算法优化循环神经网络分类模型(LSTM分类算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法(Fire-fly algorithm,FA)由剑桥大学Yang于2009年提出 , …

利用Python中的Manim进行数学绘画和创作

相信很多同学就算没听过3Blue1Brown,也一定曾看过他们出品的视频,其从独特的视觉角度解说各种数学概念,内容包括线性代数、微积分、神经网络、傅里叶变换以及四元数等晦涩难懂的知识点。例如最火的《线性代数本质》系列视频。 那么这些视频是…

[学习记录]Node event loop 总结流程图

文章目录 文章来源根据内容输出的流程图待处理遗留的问题参考 文章来源 详解JavaScript中的Event Loop(事件循环)机制 根据内容输出的流程图 待处理 这里从polling阶段开始 好像有些问题 遗留的问题 为什么“在I/O事件的回调中,setImmediate…

Android 获取应用签名

Android 获取应用签名 本文主要讲下在android中如何获取应用签名. 也方便平时用来区分一个应用是不是原包应用. 1: 通过PackageManager获取签名信息 首先,通过packageManager获取到指定应用的PackageInfo. 这里需要传入的flag是PackageManager.GET_SIGNATURES /*** {link P…

matlab 汽车单车模型固定点跟踪算法

1、内容简介 略 29-可以交流、咨询、答疑 2、内容说明 单车模型固定点跟踪算法 单车模型,固定点跟踪算法,动画演示, 汽车单车模型、转弯动画、固定点跟踪算法、pid控制 3、仿真分析 略 A[0,5;0,0];B[0;1]; Q10*eye(2);R1; Klqr(A…