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

news2024/11/18 8:16:29

在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.coloradmin.cn/o/1390169.html

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

相关文章

避免C#WindowForm编写的程序重复打开--问题解决

目录&#xff1a; 一&#xff0c;问题描述二&#xff0c;问题解决 一&#xff0c;问题描述 ❄️当你经常使用程序或者开发程序的时候&#xff0c;可能经常都会遇到一个问题&#xff1a;就是程序exe文件当多次点击后&#xff0c;无论是否及时加载&#xff0c;都会产生原本程序的…

Elasticsearch_8.11.4_kibana_8.11.4_metricbeat_8.11.4安装及本地部署_ELK日志部署

文章目录 Elasticsearch_8.11.4_kibana_8.11.4_metricbeat_8.11.4安装及本地部署_ELK日志部署分布式引擎Elasticsearch_8.11.4安装及本地部署系统环境要求1 Windows 安装 Elasticsearch下载完成后进行解压,进入 bin 目录,找到elasticsearch.bat脚本文件执行一键启动.启动都选允…

什么是技术架构?架构和框架之间的区别是什么?怎样去做好架构设计?(二)

什么是技术架构?架构和框架之间的区别是什么?怎样去做好架构设计?(二)。 技术架构是对某一技术问题(需求)解决方案的结构化描述,由构成解决方案的组件结构及之间的交互关系构成。广义上的技术架构是一系列涵盖多类技术问题设计方案的统称,例如部署方案、存储方案、缓存…

Java重修第六天—面向对象3

通过学习本篇文章可以掌握如下知识 1、多态&#xff1b; 2、抽象类&#xff1b; 3、接口。 之前已经学过了继承&#xff0c;static等基础知识&#xff0c;这篇文章我们就开始深入了解面向对象多态、抽象类和接口的学习。 多态 多态是在继承/实现情况下的一种现象&#xf…

网络共享服务

存储类型&#xff1a;直连式&#xff08;DAS&#xff09;:距离最近&#xff0c;存储设备且直接连接到服务器上 存储区域网络&#xff08;SAN&#xff09;&#xff1a;适用于大型应用或数据库系统&#xff0c;可以使用文件的空间&#xff0c; 以及管理空间…

51单片机HC-SR04超声波测距lcd1602显示(程序+ad硬件设计+文档说明)

本帖主控使用STC89C52单片机&#xff0c;超声波测距采用HC-SR04模块&#xff0c;包含ad硬件设计和文档。 测距原理 超声波测距是通过不断检测超声波发射后遇到障碍物所反射的回波&#xff0c;从而测出发射和接收回波的时间差t,然后求出距SCt/2,式中的C为超声波波速。由于超声…

Xmind 网页端登录及多端同步

好久没用 Xmind 了&#xff0c;前几天登录网页端突然发现没办法登录了&#xff0c;总是跳转到 Xmind AI 页面。本以为他们不再支持网页端了&#xff0c;后来看提示才知道只是迁移到了新的网址&#xff0c;由原来的 xmind.works 现在改成了的 xmind.ai。又花费好长时间才重新登录…

openEuler安装Docker艰辛路程

文章目录 安装docker测试docker关于windows docker拉取镜像查看所有镜像删除镜像删除不在运行的进程强制删除正在运行的进程 启动docker容器服务-d测试 停止docker容器服务查看docker启动进程更新容器(没有自启动功能&#xff0c;更新为自启动)docker端口映射进入容器修改内容退…

Visual Studio调试模式下无法使用右键菜单将ppt转换到pdf

Visual Studio调试模式下无法使用右键菜单将ppt转换到pdf 症状 Visual Studio调试模式下&#xff0c;程序停在断点时&#xff0c;我临时需要将ppt转为pdf&#xff0c;遂右键单击文件&#xff0c;想直接转pdf&#xff0c;奈何光标转了几秒钟&#xff0c;毫无反应。 解决方法 …

ChatGPT4+Python近红外光谱数据分析及机器学习与深度学习建模

2022年11月30日&#xff0c;可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5&#xff0c;将人工智能的发展推向了一个新的高度。2023年4月&#xff0c;更强版本的ChatGPT4.0上线&#xff0c;文本、语音、图像等多模态交互方式使其在…

快速知识付费平台搭建,一分钟搭建你的专属知识服务平台

产品服务 线上线下课程传播 线上线下活动管理 项目撮合交易 找商机找合作 一对一线下交流 企业文化宣传 企业产品销售 更多服务 实时行业资讯 动态学习交流 分销代理推广 独立知识店铺 覆盖全行业 个人IP打造 独立小程序 私域运营解决方案 公域引流 营销转化 …

Unity使用Protobuf

1.下载Protobuf ProtoBuf 2.打开它并且编译 如果有报错下载相应的.net版本即可 这里默认是6.0.100 由于我本机是8.0.100所以我改了这个文件 3.编译后的文件复制到Unity Assets/Plugins下 4.写个测试的proto文件 5.然后使用protoc生成 这里实现了一个简单的bat批量生成 Protos C…

电子招投标全程在线应用安全

电子招投标全程在线应用安全解决方案 电子招投标全程在线应用是指招标人、招标代理机构、投标人、评标专家、监管机构利用公共互联网开展的招标、投标、开标、评标、定标、监管的活动过程。 由于该过程全程在线运行在风险因素较多的公共互联网上&#xff0c;存在电子招投标中…

python爬虫-代理ip理解

目录 1、为什么使用代理IP 2、代理IP 3、IP池 4、代理分类&#xff1a; 5、python中使用代理IP 6、如何找可以使用的代理IP 7、拿到IP后&#xff0c;测试IP的有效性 8、扩展理解正向代理和反向代理 1、为什么使用代理IP 就是为了防止ip被封禁&#xff0c;提高爬虫的效…

隧道应用4-内网穿透EW的简单使用

与netsh端口映射内网类似&#xff0c;也是通过跳板机实现 EW官网地址&#xff1a;http://rootkiter.com/EarthWorm EW 是一套便携式的网络穿透工具&#xff0c;具有 SOCKS v5服务架设和端口转发两大核心功能&#xff0c;可在复杂网络环境下完成网络穿透。 注&#xff1a; 考虑…

sshpass 命令exit code 6 问题解决方法

近期在使用sshpass做自动化交互的脚本&#xff0c;结果运行命令后会返回错误码6,命令如下&#xff1a; sshpass -p 123456 ssh test192.168.1.100 "uname -a" 经搜索资料发现&#xff0c;错误码6指的是Host public key is unknown&#xff0c;也就是说要访问的地址是…

【Java基础(高级篇)】响应式编程

文章目录 1. 概述2. stream 流式编程3. Reactive-Stream4. 响应式编程5. Reactor5.1 Mono和Flux5.2 subscribe()5.3 多线程5.4 常用操作API示例5.5 错误处理5.6 Sinks 工具类 1. 概述 本章将从响应式编程的开始&#xff0c;从 stream 开始逐步递进&#xff0c;如对流式编程或响…

使用 GitHub 远程仓库

使用 GitHub 远程仓库 GitHub 是最大的 Git 版本库托管商&#xff0c;是成千上万的开发者和项目能够合作进行的中心。 大部分 Git 版本库都托管在 GitHub&#xff0c;很多开源项目使用 GitHub 实现 Git 托管、问题追踪、代码审查以及其它事情。本篇文章主要带大家上手 GitHub …

element-ui表单验证时undefined (reading ‘validate‘)

我搜索了一下&#xff0c;大部分都是说不仔细造成的&#xff0c;但是我一一对照了 1、el-form中我定义了ref&#xff0c;并且ref前面也是没有加冒号的 2、el-form中也绑定了rules&#xff0c;并且rules前面加了冒号 2、el-form-item我是加了prop的&#xff0c;并且和rules中…

程序员客栈发布《2023程序员自由职业报告》

自2020年以来&#xff0c;自由职业者的生态系统迅速繁荣&#xff0c;从而塑造了一个全新的职业发展模式。2023年&#xff0c;经济形势严峻&#xff0c;但灵活就业形式越来越流行&#xff0c;包括自由职业、远程办公和平台经济等。越来越多的人选择从事自由职业或者利用互联网平…