【Spring Boot】Spring原理:Bean的作用域和生命周期

ops/2025/1/22 20:14:46/
目录
  • Spring原理
    • 一. 知识回顾
      • 1.1 回顾Spring IOC
      • 1.2 回顾Spring DI
      • 1.3 回顾如何获取对象
    • 二. Bean的作用域
    • 三. Bean的生命周期

Spring原理

一. 知识回顾

在之前IOC/DI的学习中我们也用到了Bean对象,现在先来回顾一下IOC/DI的知识吧!
首先Spring IOC,也叫控制反转,简单来说就是依赖添加5大注解把该对象交给Spring来管理,Spring会把该对象放入IOC容器中,在接下来的调用中直接注入即可,注入也就是Spring DI操作了。
回顾一下,一共有以下五大注解:

1.1 回顾Spring IOC

类注解

  1. @Controller(控制层注解)
  2. @Service(逻辑层注解)
  3. @Repository(数据层注解)
  4. @Component(总注解)
  5. @Configuration(插件注解)

然后就是有一点要注意的就是,@Component注解可以说是其他四个注解的父注解,就是其他注解底层都是依赖@Component来实现的,都可以使用@Component注解来代替使用,但是不能代替@Controller,因为别忘了Controller注解还有返回视图的作用,这是@Component注解所不具备的

方法注解

  1. @Bean(方法注解)

该注解用于把方法交给Spring进行管理,但是必须和类注解连用

1.2 回顾Spring DI

Spring DI就是把IOC容器里的东西拿出来进行使用,主要是@Autowired注解,主要有三种注入方式

  1. 属性注入(就是通过给成员变量进行注入)
  2. 构造注入(就是通过构造方法注入)
  3. Set方法注入

其实在实际运用中,使用属性注入基本上能满足90%的需求了.

Spring DI主要面试考的主要是拥有多个相同对象,注入时该如何保证

主要提供了以下三大注解

  1. @Primary(默认注入的方法)
  2. @Qualifier(加入要注入对象的方法名称)
  3. @Resource(要注入对象的名称)

@Autowird与@Resource的区别

  1. @Autowired是spring框架提供的注解,@Resource是JDK提供的注解
  2. @Autowired默认是按照类型注,@Resource是按照名称注.相于@Autowired来说,@Resource持更多的参数设置,例如name设置,根据名称获取Bean。
1.3 回顾如何获取对象

Spring主要提供了两种方法获取Bean对象:

  1. ApplicationContext(上下文)
  2. @Autowired

第二种是注入方式就不一一叙述了,主要是ApplicationContext获取Bean对象,其实就是调用了分类BeanFactory工厂来获取对象。
两者主要有以下两点区别:

  1. 继承关系和功能方来说:Spring容器有两个顶级的接口:BeanFactory和
    ApplicationContext。其中BeanFactory提供了基础的访问容器的能,
    ApplicationContext属于BeanFactory的类,它除了继承了BeanFactory的所有功能之外,
    它还拥有独特的特性,还添加了对国际化持、资源访问持、以及事件传播等方的持.

  2. 从性能方来说:ApplicationContext是次性加载并初始化所有的Bean对象,也就是饿加载,
    BeanFactory是需要那个才去加载那个,也就是懒加载,因此更加轻量.(空间换时间)

好了,回顾完了Spring IOC/DI的知识点了,就该进入正题了。

二. Bean的作用域

Bean的作用域是指Bean在Spring框架中的某种行为模式.

主要有以下6种作用域

  1. singleton:单例作用域
  2. prototype:原型作用域(多例作用域)
  3. request:请求作用域
  4. session:会话作用域
  5. Application:全局作用域
  6. websocket:HTTPWebSocket作用域

作用域

说明

singleton

每个SpringIoC容器内同名称的bean只有个实例(单例)(默认)

prototype

每次使用该bean时会创建新的实例(单例)

request

每个HTTP请求生命周期内,创建新的实例(web环境中)

session

每个HTTPSession生命周期内,创建新的实例(web环境中)

application

每个ServletContext生命周期内,创建新的实例(web环境中)

websocket

每个WebSocket生命周期内,创建新的实例(web环境中)

单例作用域:多次访问,得到的都是同个对象,并且 @Autowired 和 applicationContext.getBean()
也是同个对象.

多例作用域:观察ContextDog,每次获取的对象都不样(注的对象在Spring容器启动时,就已经注了,所以多次请求也不会发生变化)

请求作用域:在次请求中, @Autowired 和 applicationContext.getBean() 也是同个对象.
但是每次请求,都会重新创建对象

会话作用域:在个session中,多次请求,获取到的对象都是同个,换个浏览器访问,发现会重新创建对象.(另个Session)

Application作用域:在个应用中,多次访问都是同个对象

注意:Applicationscope就是对于整个web容器来说,bean的作用域是ServletContext级别的.这个和
singleton有点类似,区别在于:Applicationscope是ServletContext的单例,singleton是个
ApplicationContext的单例.在个web容器中ApplicationContext可以有多个

三. Bean的生命周期

生命周期指的是个对象从诞生到销毁的整个生命过程,我们把这个过程就叫做个对象的生命周期.
Bean的生命周期分为以下5个部分:

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

  2. 属性赋值(Bean注和装配,如 @AutoWired )

  3. 初始化
    执行各种通知,如 BeanNameAware , BeanFactoryAware ,ApplicationContextAware 的接口方法.

  4. 使用Bean

  5. 销毁Bean
    销毁容器的各种方法,如 @PreDestroy , DisposableBean 接口方法, destroymethod.

在这里插入图片描述
实现的代码如下:

@Component
public class BeanLifeComponent implements BeanNameAware {private UserComponent userComponent;public BeanLifeComponent() {System.out.println("执行构造函数");}@Autowiredpublic void setUserComponent(UserComponent userComponent) {System.out.println("设置属性userComponent");this.userComponent = userComponent;}@Overridepublic void setBeanName(String s) {System.out.println("执行了 setBeanName 方法:" + s);}/*** 初始化*/@PostConstructpublic void postConstruct() {System.out.println("执行 PostConstruct()");}public void use() {System.out.println("执行了use方法");}/*** 销毁前执行方法*/@PreDestroypublic void preDestroy() {System.out.println("执行:preDestroy()");}
}

http://www.ppmy.cn/ops/152267.html

相关文章

金融场景 PB 级大规模日志平台:中信银行信用卡中心从 Elasticsearch 到 Apache Doris 的先进实践

导读:中信银行信用卡中心每日新增日志数据 140 亿条(80TB),全量归档日志量超 40PB,早期基于 Elasticsearch 构建的日志云平台,面临存储成本高、实时写入性能差、文本检索慢以及日志分析能力不足等问题。因此…

使用Docker构建Node.js应用的详细指南

引言 Docker平台允许开发者将应用程序打包并运行为容器。容器是一个在共享操作系统上运行的隔离进程,提供了一种比虚拟机更轻量级的替代方案。尽管容器并不是新事物,但它们提供的好处——包括进程隔离和环境标准化——随着越来越多的开发者使用分布式应…

MySQL表创建分区键

DISTRIBUTED BY (user_id) 是在某些分布式数据库系统中用于定义表分区策略的语法,特别是与 Greenplum、PostgreSQL(结合 Citus 扩展)或 Apache Hive 等系统相关。它指定了如何根据特定列(如 user_id)来分布数据到不同的…

【蓝桥杯】43693.日期问题

题目描述 小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在 1960 年 1 月 1 日至 2059 年 12 月 31 日。令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用…

Apache Hive 聚合函数与 OVER 窗口函数:从基础到高级应用

在大数据时代,Apache Hive 是处理和分析海量数据的强大工具。Hive 提供了丰富的聚合函数和强大的 OVER 窗口函数,能够帮助我们高效地进行数据分析。本文将综合介绍 Hive 的聚合函数和 OVER 窗口函数,结合实际使用场景和代码示例,帮…

【2024 年度总结】从小白慢慢成长

【2024 年度总结】从小白慢慢成长 1. 加入 CSDN 的契机2. 学习过程2.1 万事开头难2.2 下定决心开始学习2.3 融入技术圈2.4 完成万粉的目标 3. 经验分享3.1 工具的选择3.2 如何提升文章质量3.3 学会善用 AI 工具 4. 保持初心,继续前行 1. 加入 CSDN 的契机 首次接触…

SQLLOADER小实验

SQLLOADER实验: 建立一个实验用目录: mkdir -p /home/oracle/sqlldr --在ORACLE用户下执行 在数据库HR用户下创建一个表: create table dept(deptno number(5),dname varchar2(15),loc varchar2(15)); 1)创建数据文件 vi t…

2025web建议

随便收集的信息 新手入门路线推荐 第一步:Web安全相关概念 建议学习时间:2周 学习内容如下: 1、熟悉基本概念(SQL注入、上传、XSS、CSRF、一句话木马等)。 2、通过关键字(SQL注入、上传、XSS、CSRF、一句话木马等)进行Google。 3、阅读《Web…