Spring 中 Bean 对象的存储和取出

news2024/11/24 12:45:33

由于 Spring 拥有对象的管理权,所以我们也需要拥有较为高效的对象存储和取出的手段,下面我们来分别总结一下:

存对象

配置文件

在存储对象之前,我们需要先配置一下 Spring 的扫描目录,这样 Spring 即可在正确的目录中识别出我们想要给交给 Spring 进行管理的对象

首先在项目中的 resources 目录下添加一个 xml 文件,名字可以自定义

在这里插入图片描述

随后在这个 xml 中添加如下代码,这段代码可以直接复制,但是要修改倒数第二行的 base-package 中的路径改成自己的路径

<?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">
    <? 下面这行代码是设置 spring 的扫描目录,base-package 中的路径 可以直接设置成我们代码中的根目录 ?>
    <content:component-scan base-package="dir"></content:component-scan>
</beans>

类注释

在 Spring 中我们可以通过类注释或者方法注释来进行对象的存储,其中类注释是用的比较多的,类注释总共有 5 种:

  • @Conntroller,业务逻辑层
  • @Service,服务器存储
  • @Repository,仓库存储,可以用来操作数据库
  • @Component,项目组件层
  • @Configuration,配置层

这五种类注释的作用都是可以直接将这个类对象储存到 Spring 中,但是却有 5 种类注释,这么做的原因是:能够让我们看到类注释就能得知这个类的大致功用

命名规则

类注释中有两套命名规则

  • 如果当前类名中前两个字母都是大写,那么存入 Spring 中的对象名字默认是类名
  • 否则名字为第一个字母转为小写后的类名

除了上面 5 种类注释之外,还有方法注释

方法注释

方法注释就是将注释@Bean加到方法上方,并且必须搭配类方法使用

作用:将这个方法返回的对象存入到 Spring 中

例如

@Controller
public class Student {
    @Bean
    private Student getStudent() {
        return new Student();
    }
}

通过 @Bean 注释存入 Spring 中的对象名字默认是方法名,我们也可以直接在 @Bean 后面直接加上参数指定这个对象的名字,例如

@Controller
public class Student {
    @Bean(name="sb")  // 设置对象的名字
    private Student getStudent() {
        return new Student();
    }
}

取对象

在 Spring 中,获取 Spring 中的对象也有另一种叫法:对象装配
主要有三种对象装配的方式

属性注入

我们可以直接在成员变量中添加 @Autowired 注释, @Autowired 会优先匹配 Spring 中类名相同的对象,例如下面代码中的 user,Autowired 会优先按照 user 的类型在 spring 中进行匹配

@Controller
public class Student {
    @Autowired
    private User user;

    @Bean(name="sb")
    private Student getStudent() {
        return new Student();
    }
}

这种注入方式很简单也很快,但是缺点不少:

  • 可移植性差,这个用法是建立在 IoC 容器上的,移植到其他框架上可能无法使用
  • 无法注入不可变的对象,也就是 final 修饰的对象
    因为 final 修饰的变量只有两个初始化时机,第一个是直接赋值,第二个是在类的构造方法中赋值,显然这种对象注入的方式无法满足其中一个条件
  • 由于使用简单,容易滥用,所以比较容易被违背单一设计原则(即一个类只干一件事)

setter 注入

首先创建一个要注入的对象,然后通过「右键 — generate — setter」生成一个 setter 方法,最后在这个 setter 方法头顶上添加 @Autowired 注释

@Controller
public class Student {

    private User user;

    @Autowired  // 通过 setter 注入
    public void setUser(User user) {
        this.user = user;
    }
}

setter 注入的缺点:

  • 由于是 setter 方法,所以可能多次调用,这就意味着这个对象可以被多次修改
  • 依旧无法注入 final 修饰的对象,原因同上

构造方法注入

顾名思义,这是在构造方法上添加 @Autowired 注释来注入对象,如下

@Controller
public class Student {
    private User user;

    @Autowired
    public Student(User user) {
        this.user = user;
    }
}

构造方法注入的优点:

  • 由于是构造方法,只会执行一次,所以对象不会被重复更改
  • 可以注入 final 修饰的对象(在构造方法中赋值)
  • JDK本身就支持构造方法,所以有更低的门槛,说人话:具有更强的可移植性

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

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

相关文章

JVM复习【面试】

JVM复习【面试】前言推荐复习【JVM】第一部分 走进Java第1章 走进Java /2第二部分 自动内存管理机制第2章 Java内存区域与内存溢出异常 /382.2 运行时数据区 /382.2.2 Java虚拟机栈 /392.3 HotSpot虚拟机对象探秘2.3.1 对象的创建 /442.3.2 对象的内存布局 /472.4 实战&#xf…

HTML-Demo:工商银行电子汇款单

HTML-Demo&#xff1a;工商银行电子汇款单 Date: November 20, 2022 Demo简介&#xff1a; 简要说明一下这个demo 用HTML完成以下表格 知识点简介&#xff1a; 简要介绍其中一些知识点 表格属性 cellspacing 与 cellpadding 功能&#xff1a; cellpadding和cellspacing属性控…

面试:java中的各种锁对比

共享锁 共享锁有CountDownLatch, CyclicBarrier, Semaphore, ReentrantReadWriteLock等 ReadWriteLock&#xff0c;顾名思义&#xff0c;是读写锁。它维护了一对相关的锁 — — “读取锁”和“写入锁”&#xff0c;一个用于读取操作&#xff0c;另一个用于写入操作。“读取锁…

D. Make It Round(贪心 贡献 数学)[Codeforces Round #834 (Div. 3)]

题目如下&#xff1a; 思路 or 题解&#xff1a; 我们先考虑如何操作使结尾有最多的 0 我们不难发现&#xff1a; 2 * 5 10 10 10 我们是否只需要考虑 2 与 5 的贡献就行了 答案是肯定的&#xff01;&#xff01;&#xff01; 约定&#xff1a; cnt5因数5的个数cnt_5 因数 …

kubernetes集群安装Ingress-nginx

文章目录概述搭建环境版本对应关系yaml文件安装实操演示常见问题外链地址概述 Ingress 公开从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。 Kubernetes 通过 kube-proxy 服务实现了 Service 的对外发布及负载均衡&#xff0c;它的各…

2.3、传输方式

2.3、传输方式 2.3.1、串行&并行 2.3.3.1、串行传输 串行传输是指数据是一个比特一个比特依次发送的。因此&#xff0c;在发送端与接收端之间只需要一条数据传输线路即可 2.3.3.2、并行传输 一次发送 nnn 个比特。为此&#xff0c;在发送端和接收端之间需要有 nnn 条传输…

解决vscode各种异常格式化编译器配置

在vscode中创建vue文件时&#xff0c;若编辑代码时会出现间隔一段时间后自动的格式化内容&#xff0c;会很烦&#xff0c;经反复改查后无果&#xff0c;后来&#xff0c;对编辑器进行全面配置 首先原setting.json文件中的代码是这样的 { "files.autoSave": &qu…

定压补水装置 隔膜式定压补水装置

循环水中气体的来源及危害 A、气体来源 1、补水中夹带气体。 2、在定压不稳时吸入的气体。 3、放水时气体的侵入。 4、管道阀门等设备跑冒滴漏时侵入。 B、气体存在的危害 1、容易形成气阻&#xff0c;增加运营成本。 水中气体不及时排除&#xff0c;它所形成空气袋或气柱&am…

Vue学习(九)——混入

前言 混入&#xff08;mixin&#xff09;的使用非常简单&#xff0c;其实我原本打算直接写插件&#xff08;plugin&#xff09;的&#xff0c;但考虑到插件的使用范围也包括混入和自定义指令&#xff0c;还是先讲讲这两个的基本概念。 混入在我看来&#xff0c;就是给组件加上…

maya 卡通草地制作方法笔记

maya 卡通草地制作方法笔记 一、概述 maya制作草地的方法很多&#xff0c;有粒子替代种子法&#xff0c;painter笔刷法&#xff0c;xgen毛发模拟法&#xff0c;也有直接批量大量代理物体复制法等等。这次讨论的是用maya的painter笔刷法&#xff0c;审核制作卡通类简单的草地效…

Linux 进程概念 —— 冯 • 诺依曼体系结构

文章目录1. 冯诺依曼体系结构&#x1f351; 输入、输出设备&#x1f351; 中央处理器&#x1f351; 内存&#x1f351; 总线&#x1f351; 局部性原理&#x1f351; 总结2. 数据的流动过程1. 冯诺依曼体系结构 在 1945 年冯诺依曼和其他计算机科学家们提出了计算机具体实现的报…

URL和URI的区别

文章目录URLSchemeAuthorityPath to resourceParametersAnchorURL和URI参考URL 以下是 URL 的一些示例&#xff1a; https://developer.mozilla.org https://developer.mozilla.org/en-US/docs/Learn/ https://developer.mozilla.org/en-US/search?qURL这些 URL 中的任何一个…

[附源码]java毕业设计水库水面漂浮物WEB系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

攻防世界Check

Check 题目描述&#xff1a;套娃&#xff1f; 题目环境&#xff1a;https://download.csdn.net/download/m0_59188912/87097474 将图片放入winhex中打开&#xff0c;文件头与文件尾均正常&#xff0c;文件大小也正常。 判断为lsb隐写&#xff0c;查看三个颜色的plane 0通道&…

mysql复习【面试】

mysql复习【面试】前言mysql复习第08章 索引的创建与设计原则3.索引设计原则3.2哪些情况下适合创建索引3.4 哪些情况不适合创建索引第10章 索引优化与查询优化2.索引失效案例8.覆盖索引9. 如何给字符串添加索引10. 索引下推11. 普通索引 vs 唯一索引12.其他的优化策略13. 淘宝数…

深入浅出学习透析Nginx服务器的基本原理和配置指南「负载均衡篇」

负载均衡 之前的章节内容中【深入浅出学习透析Nginx服务器的基本原理和配置指南「初级实践篇 」】和 【深入浅出学习透析Nginx服务器的基本原理和配置指南「进阶实践篇」】&#xff0c;我们采用的代理仅仅指向一个服务器。但是网站在实际运营过程中&#xff0c;大部分都是以集群…

【万兴PDF专家】OCR引擎的离线安装方法,让你不受网速的折磨,PDF给OCR成可搜索的高级PDF,牛逼了我的万兴

一、问题背景 万兴PDF是一个很好用的PDF工具&#xff0c;它不仅可以实现PDF的浏览和批注常见功能&#xff0c;还具有OCR、压缩PDF&#xff0c;乃至批量化的功能。 因此&#xff0c;实在是一个非常值得花钱去买的PDF工具包&#xff01;&#xff01; 但是&#xff0c;软件里的O…

Prometheus与Grafana监控SpringBoot应用

Prometheus与Grafana监控SpringBoot应用 1.SpringBoot应用暴露端点 2.转换成Prometheus能解析得数据 3.向Prometheus注册时赋予项目名 docker部署 4701模板

七.STM32F030C8T6 MCU开发之TIMER模块级联组成32BIT计时器案例

七.STM32F030C8T6 MCU开发之TIMER模块级联组成32BIT计时器案例 文章目录七.STM32F030C8T6 MCU开发之TIMER模块级联组成32BIT计时器案例0.总体功能概述1.TIM硬件介绍1.1 TIM1/3级联硬件介绍1.1.1 主从模式介绍1.1.2 TIM1为主&#xff0c;TIM3为从&#xff0c;TIM3 的输入触发源选…

【计算机网络】习题(三)—— 数据链路层

【计算机网络】习题&#xff08;三&#xff09;—— 数据链路层2&#xff0e;数据链路层协议的功能不包括&#xff08;). A&#xff0e;定义数据格式 B。提供结点之间的可靠传输 C.控制对物理传输介质的访问 D.为终端结点隐蔽物理传输的细节 2.D 主是是数据链路层的主要功能包…