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

news/2025/1/23 4:28:43/
目录
  • 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/news/1565390.html

相关文章

C# 多线程 安全数据结构

多线程技术 在如今 cpu技术发展的前提下,可以说是高频率使用技术,自然会有相应的一些封装好的 数据结构 在内部满足了 线程安全,以供使用。 ConcurrentQueue 线程安全队列 队列的特点 先进先出 如何保证线程安全的其实就是 用了线程同步的sp…

.Net 学习指南与资料分享

.NET学习资料 .NET学习资料 .NET学习资料 在当今数字化时代,软件开发领域蓬勃发展,.NET 作为微软推出的强大开发平台,凭借其出色的性能、跨平台特性以及丰富的生态系统,在企业级应用、Web 应用、移动应用等众多领域都有着广泛的…

基于Spring Boot的车间调度管理系统

基于 Spring Boot 的车间调度管理系统 一、系统概述 基于 Spring Boot 的车间调度管理系统是一个为制造企业车间生产活动提供智能化调度和管理解决方案的软件系统。它利用 Spring Boot 框架的便捷性和高效性,整合车间内的人员、设备、物料、任务等资源&#xff0c…

【JavaEE】Spring(1)

一、什么是Spring和SpringBoot Spring是Java应用程序的开发框架,其目的就是为了简化Java开发;SpringBoot是在spring框架的基础上构建的一个快速开发框架,其作用是进一步简化Spring程序开发 二、SpringBoot项目 2.1 创建项目 1. 设置jdk版本…

AG32 FPGA 的 Block RAM 资源:M9K 使用

1. 概述 AG32 FPGA 包含了 4 个 M9K 块,每个 M9K 块的容量为 8192 bits,总计为 4 个 M9K(4K bytes)。这使得 AG32 的内部存储非常适合嵌入式应用,能够有效地利用片上资源。 M9K 参数 参考自《AGRV2K_Rev2.0.pdf》。…

Java设计模式 十一 外观模式 (Facade Pattern)

外观模式 (Facade Pattern) 外观模式是一种结构型设计模式,其核心思想是为子系统中的一组接口提供一个统一的高层接口,使得子系统的使用更加简单。外观模式通过创建一个外观类(Facade),将复杂的子系统接口封装起来&am…

优雅解决webview_flutter不支持安卓选择图片视频文件问题

这个问题,网上一搜索,就是要去修改别人写好的插件。 搞Flutter开发,尽量不要去修改别人的插件 ,特别是像 webview_flutter 这种比较大的官方插件。 相信我,你拿捏不了它。 主要问题就是: webview_flutter…

Golang Gin系列-5:数据模型和数据库

在这篇Gin教程的博客中,我们将探索如何将模型和数据库与Gin框架无缝集成,使你能够构建健壮且可扩展的web应用程序。通过利用流行的库并遵循最佳实践,你将学习如何定义模型、建立数据库连接、执行CRUD操作以及确保基于gin的项目中的数据完整性…