Spring基础属性一览:注释、对象装配、作用域、生命周期

在Spring中想要更简单的存储和读取对象的核心是使用注解,也就是我们接下来要学的Spring中相关注解。

之前我们存储Bean时,需要在自己添加的配置文件中添加一行bean才行:

而现在我们只需要一个注解就可以替代之前要写的一行配置的繁琐了。

目录

1.前置工作:配置扫描路径

2.添加注释

2.1 类注解

2.2 Bean 命名规则

2.3 方法注解 

获取Bean对象(对象装配)

属性注入

Setter注入

构造方法注入

@Resource

@Qualifier

Lombok

Spring Bean作用域

singleton 单例作用域

prototype 原型作用域(多例作用域)

request 请求作用域

session 会话作用域

application 全局作用域

websocket

配置方式

Spring执行流程和生命周期

执行流程

生命周期


1.前置工作:配置扫描路径

对于Spring来说,如果需要扫描所有的项目路径,对于性能影响非常大。所以我们配置一个要储存对象的扫描包路径。只有被配置的包下的所有类,并且添加了注释,才能够正确的识别并保存到Spring中。

<?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"><content:component-scan base-package="com.spring.demo"></content:component-scan>
</beans>

base-package就是扫描路径。需要保证添加的注释都要在这个路径下面。

2.添加注释

想要将对象储存在Spring中,有两种注解类型可以实现:

  • 类注解:@Controller、@Service、@Repository、@Component、@Configuration
  • 方法注解:@Bean

顾名思义,类注解就是注解在类上,方法注解同理。

2.1 类注解

当把UserController用Controller注释后,通过之前读取对象的方式来获取到对象。

可以发现,确实是和之前把具体的id和class存到配置文件一样的效果。而通过注释的方式更加方便简单。

并且,其他的另外四个注解的效果都是一样的,都可以通过读取对象的方式拿到Spring中存取的对象。

那么为什么要有这么多类注解?

最主要的原因方便阅读,望文生义,可以直接了解当前类的用途。

  • @Controller:业务逻辑层
  • @Servie:服务层
  • @Repository:持久层
  • @Configuration:配置层

类似于之前学习Servlet时的service、DAO、API这样的分层。

并且@Controller、@Service、@Repository、@Configuration都是@Component的子类。

2.2 Bean 命名规则

通常我们使用的bean都是大驼峰命名,而读取的时候首字母小写就可以获取到bean:

但是如果首字母和第二个字母都是大写时,就不能正常获取到bean了:

具体的Spring关于bean的命名规则究竟是什么样的呢?

在IDEA中搜索AnnotationBeanNameGenerator可以找到buildDefaultBeanName方法:

它使用的是Introspector中的decapitalize方法,这是JDK中的方法,源码:

这个就是具体的命名规则了:如果第一个字母和第二个字母都为大写,Bean为原类名。如果是大驼峰,就把第一个字母小写。

2.3 方法注解 

类注解是添加到某个类上的,而方法注解是放到某个方法上的。

对于一个User类,我们添加一个获取user这样一个方法,并且添加类注解:

但是并不能得到我们想要的结果,这是为什么?

方法注解要配合类注解使用。这是Spring为了性能而规定的。 

通过这样的方式就可以拿到user1。

同时还可以给Bean重命名,不过重命名后通过方法名就拿不到对象了,只能通过重命名的来拿到对象。

获取Bean对象(对象装配)

获取bean对象也叫做对象装配,就是把某个对象取出来放到某个类中,也叫做对象注入。

有三种方式:属性注入、Setter注入、构造方法注入。通过@Autowired来注入。@Autowired来自于Spring。

属性注入

假设我们现在有两个类,需要把Service类注入到Controller类中。

通过@Autowired就可以在不new对象的情况下,直接获得注入的对象了。

但是有很多缺点:

  1. 功能性问题:无法注入一个不可变的对象(final 修饰的对象);
  2. 通用性问题:只能适应于 IoC 容器;
  3. 设计原则问题:更容易违背单一设计原则。

Setter注入

在Controller中需要获取到Service,那么就在Controller中设置一个Setter方法,再用Autowired注入,这样就可以拿到Service。

优缺点:

  1. 复合单一设计原则
  2. 不能注入final修饰的对象
  3. 注入的对象可能会被修改

构造方法注入

注入方法注入是直接在类的构造方法中实现注入,并且是Spring官方推荐使用的方式:

并且如果只有一个构造方法,那么@Autowired注释可以省略。

构造方法注入相比于前两种注入方法,它可以注入final修饰的对象,并且也只会执行一次,不会被修改。无论是IoC还是非IoC都是可以用的。

@Resource

@Resource是另一种注入关键字,来自于JDK。只能用于属性注入和Setter注入中。

相比于@Autowired来说,@Resource支持更多的参数设置,例如name设置,根据名称获取Bean。

很典型的例子:如果出现多个Bean,返回同一对象类型时会报错。

报错的原因是,出现了非唯一的Bean对象。

此时可以通过@Resource来定义name的值:

@Qualifier

解决同一个类型的Bean对象,除了通过@Resource定义name,还可以使用@Qualifier来定义:

Lombok

Lombok是一个非常好用的插件,能够简化代码。这是简化之前的:

使用Lombok简化后:

Lombok可以把繁琐的getter和setter方法简化成注释。

要使用Lombok,需要添加依赖和插件:

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version><scope>provided</scope></dependency>

Spring Bean作用域

Spring容器在初始化一个Bean的实例时,同时会指定该实例的作用域。默认情况下,Bean的作用域单例作用域。

singleton 单例作用域

当一个bean的作用域为singleton,所有对bean的读取都是访问的同一个实例(对象)。

好处就是可以获得更好的性能,因为只有一份bean。

但是坏处就是如果不同的用户修改了,那么后来的用户拿到的值已经是前一个用户修改过的值。

prototype 原型作用域(多例作用域)

和singleton完全不同,可以看做每次读取bean对象都是对原型bean的一份拷贝。所有的读取的bean都是新的一份bean实例。

request 请求作用域

request适用于Spring MVC 和 Spring Web。

每次HTTP请求,都会创建一个Bean实例。

session 会话作用域

session适用于Spring MVC。

一个HtttpSession共享一个Bean实例。

application 全局作用域

application适用于Spring MVC。

一个http servlet context中共享一个bean。

websocket

 网络长连接,只适用于Spring WebSocket项目。

配置方式

使用@Scope标签可以声明Bean的作用域,比如设置Bean的作用域:

两种方式都可以,一种是直接设置值,另一种使用的枚举设置。

Spring执行流程和生命周期

执行流程

第一步:启动容器

第二步:加载配置文件spring_config.xml,完成初始化

第三步:扫描路径底下的Spring注释:@Controller、@Service、@Component、@Repository,并且注册Bean对象到容器中。

第四步:获取Bean对象(装配Bean)

生命周期

生命周期指的就是一个对象从创建到销毁的整个过程。

Bean的生命周期分为五个部分:

1.实例化Bean,为Bean分配内存空间

2.设置属性,也就是Bean的注入和装配

3.Bean初始化,在这里实现了很多种方式,如Aware方法,初始化前置、初始化、初始化后置方法和自己指定的init-method方法。

4.使用Bean

5.销毁Bean

关于生命周期这里有一定难度,可以参考其他的文章~

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

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

相关文章

消息队列的作用与使用场景?

一、消息队列的作用 队列的主要作用是消除高并发访问高峰&#xff0c;加快网站的响应速度。 在不使用消息队列的情况下&#xff0c;用户的请求数据直接写入数据库&#xff0c;在高并发的情况下&#xff0c;会对数据库造成巨大的压力&#xff0c;同时也使得系统响应延迟加剧。 …

HDFS WebHDFS 读写文件分析及HTTP Chunk Transfer Encoding相关问题探究

文章目录 前言需要回答的首要问题DataNode端基于Netty的WebHDFS Service的实现基于重定向的文件写入流程写入一个大文件时WebHDFS和Hadoop Native的块分布差异 基于重定向的数据读取流程尝试读取一个小文件尝试读取一个大文件 读写过程中的Chunk Transfer-Encoding支持写文件使…

postman 简单测试(二)

接着上一节 https://blog.csdn.net/myy2012/article/details/135616719 1.Tests的简单使用&#xff08;后置处理器&#xff09; 具体的截图是每一步操作后得来的&#xff0c;记录方便自己以后查阅&#xff0c;也希望能帮助到有缘人。 1.1 把返回值存入到环境变量中&#xff…

protobuf学习日记 | 初识protobuf

目录 前言 一、序列化与反序列化 二、protobuf是什么 三、protobuf的使用特点 四、快速上手 1、proto文件编写 2、编译proto文件 3、序列化与反序列化的使用 前言 这是小编新开的一个栏目&#xff0c;为了记录自己在学习ProtoBuf的历程&#xff0c;也希望能帮助大家&am…

亚马逊店飞飞ERP系统,跟卖+铺货+物流发货模式综合一体的ERP系统

跨境电商亚马逊&#xff0c;目前为止电商行业比较靠前的电商平台&#xff01;那么有人做电商&#xff0c;就会有人出单&#xff0c;有人出单就会有中转仓需求&#xff0c;代打包&#xff0c;代贴单&#xff01;那么这一切都是有一套逻辑完善的ERP来完成&#xff01;前端通过授权…

将.NET应用转换成Window服务

写在前面 本文介绍了将.NET8.0应用程序转换成Windows服务。 需要在NuGet中获取并安装&#xff1a;Microsoft.Extensions.Hosting.WindowsServices 包 代码实现 using System.Runtime.InteropServices; using WorkerService1;public class Program {public static void Main…

Kafka 简介

目录 1、概念介绍 Kafka 由来 ZooKeeper Kafka 特性 Kafka 使用场景 Kafka 复制备份 2、Kafka 架构 Broker Topic Producer Partition Consumers Consumer Group Distribution 1、概念介绍 Kafka 由来 Kafka 是最初由 Linkedin 公司开发&#xff0c;是一个分布…

aigc修复美颜学习笔记

目录 GFPGAN进行图像人脸修复 美颜 修复畸形手势 GFPGAN进行图像人脸修复 原文&#xff1a;本地使用GFPGAN进行图像人脸修复_人相修复处理网页 csdn-CSDN博客 人脸修复 1.下载项目和权重文件 2.部署环境 3.下载权重文件 4.运行代码 5.网页端体验 首先来看一下效果图 1.下…

uni-app的项目创建和环境搭建

uni-app 是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;开发者编写一套代码&#xff0c;可发布到iOS、Android、Web&#xff08;响应式&#xff09;、以及各种小程序&#xff08;微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝&#xff09;、快应用等多个平台。 第一步…

clip安装使用教程

1.配置环境 安装依赖 pip install transformers pip install torch 看缺失什么包自己先安装好 2.安装clip 进入https://github.com/openai/CLIP&#xff0c;先将CLIP文件夹下载到本地&#xff0c;随便什么位置。即点击下图中的Download ZIP&#xff0c;下载到本地后进行解压…

HNU-编译原理-实验2-Bison

编译原理实验2Bison 计科210X 甘晴void 202108010XXX 实验要求 详细的实验项目文档为 https://gitee.com/coderwym/cminus_compiler-2023-fall/tree/master/Documentations/lab2 实验步骤 本次实验需要在 Lab1 已完成的 flex 词法分析器的基础上&#xff0c;进一步使用 b…

某侠网js逆向wasm解析

本次目标地址如下&#xff0c;使用base64解密获得 aHR0cHM6Ly93d3cud2FpbWFveGlhLm5ldC9sb2dpbg 打开网址&#xff0c;本次的目标是登录接口&#xff0c;如下图 本文主要讲解wasm的解析&#xff0c;所以对其他参数不做逆向处理&#xff0c;本次由wasm加密的参数只有sign一个&a…

DApp:去中心化的革命与挑战

DApp&#xff08;去中心化应用&#xff09;是一种基于区块链技术的应用程序&#xff0c;与传统的中心化应用程序不同&#xff0c;DApp具有去中心化、透明、不可篡改等特性。本文将介绍DApp的前世今生&#xff0c;以及它的优势和未来发展。 DApp的前世可以追溯到区块链技术的出现…

运维工具之tmux命令

tmux终端复用器的使用 1.tmux的概念 ​ tmux&#xff0c;“Terminal MultipleXer”,意思是"终端复用器"。是一个可以让人们通过一个窗口操作多个会话的工具&#xff0c;对于经常操作Linux系统的运维人员来说&#xff0c;绝对是一款提高工作效率的利器。 2.tmux能帮…

Kubernetes API 和流量控制:管理请求数量和排队进程

本文描述了我们最近遇到的一个真实案例&#xff1a;Kubernetes API 因其中一个集群中的大量请求而瘫痪。今天&#xff0c;我们将讨论我们如何处理这个问题&#xff0c;并提供一些关于如何预防它的提示。 高并发搞崩 Kubernetes API 一个非常普通的早晨&#xff0c;我们开始了…

SSC | Blue Prism报告:2024年智能自动化(IA)7大趋势预测

近日&#xff0c;RPA行业领导者SS&C | Blue Prism发布《2024智能自动化&#xff08;IA&#xff09;趋势与预测》报告。报告中提到&#xff0c;智能自动化&#xff08;IA&#xff09;与流程管理的有效融合&#xff0c;是实现数字化转型成功的核心。采用业务流程管理&#xf…

免费开源OCR 软件Umi-OCR

Umi-OCR 是一款免费、开源、可批量的离线 OCR 软件&#xff0c;基于 PaddleOCR&#xff0c;适用于 Windows10/11 平台 免费&#xff1a;本项目所有代码开源&#xff0c;完全免费。方便&#xff1a;解压即用&#xff0c;离线运行&#xff0c;无需网络。高效&#xff1a;自带高效…

数组的定义与越界问题

scanf标准读取函数 第一个冷知识&#xff0c;输入到scanf里面的内容都是字符串形式&#xff0c;但是&#xff01; scanf(“%d”,&a),%d决定了如何对输入的字符串进行操作 scanf用来读取标准输入&#xff0c;标准输入的内容需要放入到某个变量空间中去&#xff0c;因此变量…

Python数据分析案例34——IMDB电影评论情感分析(Transformer)

电影评论的情感分析 案例背景 很多同学对电影系列的数据都比较喜欢&#xff0c;那我就补充一下这个最经典的文本分类数据集&#xff0c;电影情感评论分析。用神经网络做。对国外的英文评论文本进行分类&#xff0c;看是正面还是负面情感。 数据集介绍 数据集&#xff1a;IMDb…