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

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

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

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

相关文章

基于域账户及西门子simatic logon的集中权限管理的实现(二)

上次我们完成了域环境及simatic logon服务器的搭建&#xff0c;今天我们将在wincc及HMI上进行组态&#xff0c;实现用域账户进行登录。 3.WINCC用户管理组态引文&#xff1a;博途工控人平时在哪里技术交流博途工控人社群 3.1 首先将要安装WINCC的服务器加入域。 3.2 在wincc…

springboot实现黑名单和白名单功能

题外话 关于黑名单和白名单功能&#xff0c;我觉得可以直接用linux服务器的iptables或nftables来实现黑名单和白名单功能。这两个工具都是Linux系统上用于配置防火墙规则的命令行工具。 iptables&#xff1a; 描述&#xff1a; iptables 是一个用于配置IPv4数据包过滤规则的工具…

Netty开篇——NIO章中(四)

通道(Channel) Channel类似于流&#xff0c;有些区别 同时进行读写&#xff0c;而流只能读或者只能写实现异步读写数据可以从缓冲读数据&#xff0c;也可以写数据到缓冲 Channel在 NIO 中是一个接口:public interface Channel extends Closeable{} 常用的Channel类有:FileChan…

【昕宝爸爸小模块】深入浅出之JDK21 中的虚拟线程到底是怎么回事(二)

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你&#x1f44d;点赞、&#x1f5c2;️收藏、加❤️关注哦。 本文章CSDN首发&#xff0c;欢迎转载&#xff0c;要注明出处哦&#xff01; 先感谢优秀的你能认真的看完本文&…

Arthas项目实战用法

一、简介 1、项目所在位置 2、安装Arthas 1. 下载arthas-boot.jar 2. 运行arthas-boot.jar 3. 选择进程 3、卸载Arthas 二、核心监视功能 1、monitor&#xff1a;监控方法的执行情况 2、watch&#xff1a;检测函数返回值 3、trace&#xff1a;根据路径追踪&#xff0c;…

低代码自动化测试的实践

何为低代码测试 传统上&#xff0c;功能、 UI、端到端等测试自动化的实现都涉及编写测试脚本&#xff0c;代替测试人员执行重复的手动测试任务。自动化脚本的开发工作通常由 QA 工程师或开发人员完成&#xff0c;这需要编写大量代码。 而低代码甚至无代码的理念也是在自动化测…

海外盲盒系统搭建:盲盒出海成为了盲盒企业的新机遇

盲盒在我国作为一个新型的消费模式&#xff0c;取得了较大的成功&#xff0c;也成为了当下流行的潮玩文化。盲盒在国内爆火的优势下&#xff0c;也为我国盲盒出海提供了市场基础。当下&#xff0c;海外市场具有较大的发展潜力&#xff0c;除此之外&#xff0c;盲盒出海也成为当…

transformer详解

transformer 框架注意力机制注意力评分函数(scoring function)自注意力机制&#xff08;self-attention&#xff09;masked self-attention多头注意力&#xff08;multi-head attention&#xff09; 位置编码Layer normalizationResnet&#xff08;Add&#xff09; 框架 框架解…

使用AI自动生成PPT提高制作效率

使用AI自动生成PPT提高制作效率 在制作PPT方面&#xff0c;很多制作者都会轻易跳进一个怪圈&#xff1a;“我要制作一个关于关爱老人的PPT&#xff0c;该怎么做呢&#xff0c;有模板没有?”这个会涉及很多逻辑需要经过不断的思考&#xff0c;制作PPT要通过很多素材、使用技巧、…

【报错】检索 COM 类工厂中 CLSID 为 {28E68F9A-8D75-11D1-8DC3-3C302A000000} 的组件失败错误

情况描述 在使用C#进行工控软件开发&#xff0c;需要连接通过OPC连接DCS系统时&#xff0c;需要通过visual studio的NuGet包管理器添加OpcAutomation&#xff0c;如下图所示&#xff1a; 这样便可以实现通过C#连接读取数据。但是在通过C#连接OPC server时&#xff0c;会出现错…

性能压力测试:企业成功的关键要素

性能压力测试在现代企业软件开发中扮演着至关重要的角色&#xff0c;它不仅仅是一项技术手段&#xff0c;更是保障企业成功的关键要素。本文将探讨性能压力测试在企业中的重要性&#xff0c;并阐述其对业务稳定性、用户体验和品牌声誉的影响。 一、保障业务稳定性 1、应对高负载…

java数据结构与算法刷题-----LeetCode96. 不同的二叉搜索树

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难&#xff0c;但它就是固定套路而已。其实动态规划只…

走迷宫之推箱子

前言&#xff1a; 在上一篇文章当中我介绍了一个走迷宫的写法&#xff0c;但是那个迷宫没什么可玩性和趣味性&#xff0c;所以我打算在迷宫的基础上加上一个推箱子&#xff0c;使之有更好的操作空间&#xff0c;从而增强了游戏的可玩性和趣味性。 1. 打印菜单 void menu() {…

[WUSTCTF2020]alison_likes_jojo 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 得到的 flag 请包上 flag{} 提交。 感谢 Iven Huang 师傅供题。 比赛平台&#xff1a;https://ctfgame.w-ais.cn/ 密文&#xff1a; 下载附件解压&#xff0c;得到两张jpg图片和一个文本文件。 解题思路&#x…

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

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

【Java】源码文件开头添加注释

需求 应公司质量部要求&#xff0c;需要对代码做静态检查。质量部要求&#xff0c;源码文件必须在起始行起设置一些注释&#xff0c;然而项目已经开发了一年之久&#xff0c;且没有维护这个注释。 此时&#xff0c;面对好几千个源码文件&#xff0c;我们如何快速添加相应的注…

滑块拖动验证

效果 代码 svg图标 初始图标 <svg t"1705397535958" class"icon" viewBox"0 0 1024 1024" version"1.1" xmlns"http://www.w3.org/2000/svg" p-id"1492" width"200" height"200">&l…

Kubernetes核心实战

kubernetes&#xff08;一&#xff09;概述与架构 kubernetes&#xff08;二&#xff09;创建集群 云原生实战 语雀 官网 Kubernetes 文档 | Kubernetes B站课程&#xff1a;https://www.bilibili.com/video/BV13Q4y1C7hS/?p41 1.Namespace 名称空间&#xff0c;用来对集群…

【书生·浦语】大模型实战营——LMDeploy 大模型量化部署实战

大模型部署背景 大模型部署是指将训练好的模型在特定的软硬件环境中启动的过程&#xff0c;使模型能够接收输入并返回预测结果。大模型的内存开销巨大&#xff0c;7B模型仅权重需要14G内存。另外大模型是自回归生成&#xff0c;需要缓存Attention的 k/v。 LMDeploy 简介 推理性…

SpringMVC请求源码分析

文章目录 一、SpringMVC简介1. 概念2. 从Servlet到SprigMVC3. SpringMVC的XML实现4. SpringMVC的请求流程 二、SpringMVC源码分析1. SpringMVC启动流程验证2. 细节补充 一、SpringMVC简介 1. 概念 官网介绍 Spring Web MVC is the original web framework built on the Servl…