Bean的作用域和生命周期

article/2025/9/22 21:40:05

期进springboot

目录

1.Bean的作用域

               1.1Bean的六大作用域

               1.2设置Bean的作用域

2.Bean的执行流程

3.Bean的生命周期


1.Bean的作用域

①什么是Bean的作用域:

实质上是指Bean在spring整个框架中的某种行为模式,比如singleton单例模式,就是指Bean在整个作用域中只有一份,并且是全局共享的,当其他人在任意处修改了,那么其他人读到的就是修改后的数据。

②对①中进行示例:

(大概思路就是通过公共Bean部分来对原值进行设置,然后我们用A用户对其实行修改,并接着用B用户去进行获取,看得到的值是否一致)

(1)公共Bean的部分(我们将公共bean设置于此)

package inBean;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
@Component
public class Users {@Beanpublic User user1(){User user=new User();user.setName("张三");user.setId(1);return user;}
}

(2)A用户对原来数据进行修改:

package inBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import javax.annotation.Resource;
@Controller
public class UserController4 {@Autowiredprivate User user1;public User getUser(){User user=user1;System.out.println("修改前的名称+ID"+user.getName()+user.getId());user.setId(2);user.setName("李四");return user;}
}

(3)B用户对修改后的数据来进行获取:

package inBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class UserController3 {@Autowiredprivate User user1;public User getUser1(){User user=user1;return  user;}
}

(4)main:

import inBean.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {public static void main(String[] args) {//1.先获取对象的上下文ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");//方式一UserController4 userController4=context.getBean("userController4",UserController4.class);System.out.println("A修改后的对象"+userController4.getUser().toString());UserController3 userController3=context.getBean("userController3",UserController3.class);System.out.println(userController3.getUser1());}}

输出结果:

我们在这里看到修改前的名字+ID分别为张三 1,但是当A用户进行修改后,B用户去获取到的值也是修改后的值。这是为什么呢?

这是因为spring中bean的默认情况下是单例模式,也就是修改后所有其他的读取到的都是修改后的值。 

               1.1Bean的六大作用域

①singleton:单例作用域(默认)

通常无状态(bean的状态不需要修改)下的bean就会使用该作用域,而且每一次注入的bean都是同一个bean。并且这是一种默认状态
②prototype:原型作用域(多例作用域)

原例模式实质上就是类似于多例模式,每次对该作用域下的Bean时,就会创建出新的实例。
③request:请求作用域(Spring MVC)

每次HTTP请求时就会创建出新的实例,一次HTTP请求和响应共用Bean,限于在spring MVC中使用。
④session:会话作用域(Spring MVC)

在用户会话的时候共享bean,举个例子,在你登录某个APP时,你的登录信息会被存储起来,这个时候就相当于在你登录期间,一直是在共享bean。
⑤application:全局作用域(Spring MVC)

这是关于web的上下文信息,只需了解即可。
⑥websocket: HTTP WebSocket 作用域(Spring WebSocket)

只需了解即可。

               1.2设置Bean的作用域

①直接设置:

(1)方法:

使用@Scope(“prototype”),直接将其加在Bean下即可。

(2)演示:前面我们演示了默认情况下是单例模式,此时,我们就在该单例模式的基础上来实现这个@Scope(“prototype”),使其可以成为多例模式,即修改后并不影响原来的值。

②使用枚举设置:

(这里的枚举设置并不是说真的就是枚举,只是类似于这种形式罢了) 

(1)方法:(这个的优势在于不容易输错)

@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

(2)演示:(仍然是以上面这个例子来进行修改)

实现的是和①中同样的效果,只是方法里面参数不同罢了。 

2.Bean的执行流程

①简单叙述:

当我们启动容器的时候,执行main函数时,首先会对Application中的类加载路径进行加载(spring-config.xml),紧接着会根据该xml文件中的配置扫描找到对应的包,找到对应的包后,就会开始扫描里面的spring注解,然后将Bean对象注册到容器中,这个时候如果bean对象有其他属性,也会进行读取。

②图例展示:

3.Bean的生命周期

Bean的生命周期主要分为5大过程,这里我们简单地对这五大过程进行讲解。

①实例化Bean:(买房)

实质上就是为bean分配内存空间

②设置属性:(装修)

就是指的是bean注入和配置

③Bean的初始化:(购置家具)

a.执行各种通知(执行各种 Aware) 
b. 执行初始化的前置方法;
c. 执行构造方法,两种执行方式,一种是执行@PostConstruct,另一种实质性 init-method;
d. 执行初始化的后置方法;

④使用Bean(入住)

⑤销毁bean:(卖房)

a.@PreDestory
b. 重写DisposableBean接口方法
c.destroy-method

下面我们来用代码证实一下确实经过了这些过程:

import org.springframework.beans.factory.BeanNameAware;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
@Component
public class BeanLifeComponent implements BeanNameAware {@PostConstructpublic void postConstruct() {System.out.println("执行 @PostConstruct");}public void init() {System.out.println("执行 init-method");}public void use() {System.out.println("使用 bean");}@PreDestroypublic void preDestroy() {System.out.println("执行了 @PreDestroy");}public void setBeanName(String s) {System.out.println("执行了 Aware 通知");}
}
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {public static void main(String[] args) {ClassPathXmlApplicationContext context =new ClassPathXmlApplicationContext("spring-config.xml");BeanLifeComponent beanLifeComponent = context.getBean("beanLifeComponent",BeanLifeComponent.class);beanLifeComponent.use();context.destroy();}}

输出结果:

下期我们将讲解springboot相关内容~


http://chatgpt.dhexx.cn/article/sb7GlICQ.shtml

相关文章

7-Bean的作用域

目录 1.作用域定义 2.Bean的6种作用域 2.1.singleton:单例作用域(默认作用域) 2.2.prototype:原型作用域(多例作用域) 2.3.request:请求作用域 2.4.session:会话作用域 2.5.a…

Spring Bean的作用域以及注解使用

点击上方 Java学习之道,选择 设为星标 每天12点,干货准时奉上! Spring Bean的作用域 Spring Bean 的作用域即为对象的作用范围。Spring Bean的作用域由配置项 scope 来限定。 Scope配置项 作用域限定了 Spring Bean 的作用范围,在…

JAVA bean的作用域

1、Bean的5种作用域 (1)singleton:单例模式,Spring IoC容器中只会存在一个共享的Bean实例,无论有多少个Bean引用它,始终指向同一对象Singleton作用域是Spring中的缺省作用域,也可以显示的将Bean…

Bean 作用域和生命周期

文章目录 引入 Lombok1. Bean 的作用域问题2. 作用域定义2.1 作用域类型2.2 Bean 作用域的设置 3. Bean 的生命周期3.1 执行流程:3.2 **代码示例:** 4.Spring 生命周期 Spring 容器是用来存储和读取 Bean 的 , 因此 Bean 是 Spring 中最核心的操作资源. 引入 Lombok 编写代码过…

【Spring6】| Bean的作用域

目录 一:Bean的作用域 1. singleton(单例) 2. prototype(多例) 3. 其它scope 4. 自定义scop(了解) tips:首先给大家推荐两款好用的免费软件:动图抓取软件&#xff1…

Spring Bean的作用域及生命周期

目录 前言: Bean的作用域(Scope) 单例模式 原型模式(多例作用域) 请求作用域(request) 会话作用域 全局作用域 网络长连接 Spring执行流程 Bean的生命周期 测试 小结: 前…

Spring中Bean的作用域问题

文章目录 一、通过案例来简单体会一下Bean的作用域问题二、作用域定义三、Bean的作用域分类singletonprototyperequestsessionapplication(了解)singleton(单例作用域) 和 application (全局作用域)的区别w…

面试:Bean 作用域是什么?它有几种类型?

Spring 框架作为一个管理 Bean 的 IoC 容器,那么 Bean 自然是 Spring 中的重要资源了,那 Bean 的作用域是什么意思?又有几种类型呢?接下来我们一起来看。 PS:Java 中的公共类可称之为 Bean 或 Java Bean。 1、作用域…

Spring系列8:bean的作用域

本文内容 bean定义信息的意义介绍6种bean的作用域 bean定义信息的意义 Spring中区分下类、类定义信息,类实例对象的概念?不容易理解,以餐馆中点炒饭为例。 类: 相当于你看到菜单上炒饭这个菜品,有这个菜。 类定义…

【Java第34期】:Bean的六种作用域

作者:有只小猪飞走啦 博客地址:https://blog.csdn.net/m0_62262008?typeblog 内容:介绍Bean的六种作用域的效果以及适用场景 文章目录 前言一,作用域定义以及Bean的六种作用域是什么?二,singleton&#…

Bean的六种作用域

什么是Bean的作用域呢? 这里的"作用域"还和Java中的类级,方法级等这几个作用域概念不太一样,我自己的一个理解是:在Spring执行的这段时间中,Bean的作用域就只有单例和多例这两种,在执行respect这段时间之中,就有它自己的作用域,而到了session中又有它自己的作用域,…

Spring Bean的作用域

在Spring中,bean作用域用于确定哪种类型的bean实例应该从Spring容器中返回给调用者。 目前Spring Bean的作用域或者说范围主要有五种。 作用域描述singleton在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,bean作用域范围的默认值…

设计原则-依赖倒置

名称:依赖倒置原则(Dependence Inversion Principle) 定义:程序要依赖于抽象接口,不要依赖于具体实现。依赖倒置原则的中心思想是面向接口编程。 高层模块不应依赖于低层模块,二者都应该依赖于抽象抽象不…

C++之依赖倒置原则

C之依赖倒置原则 1. 依赖于具体抽象(接口),不依赖于具体的实现,也就是针对接口编程。 2. 实现高层业务和实现层、实现层和实现层之间的解耦合; 实例: 电脑框架和电脑内部的配件产品(或提供配…

【软件架构设计原则】开闭原则和依赖倒置原则

文章目录 软件架构设计原则开闭原则依赖倒置原则最后 软件架构设计原则 本文通过实例来讲解 开闭原则依赖导致原则 开闭原则 开闭原则(Open-Close Principle,OCP)是指一个软件实体(如类、模块和函数)应该对扩展开放…

java 依赖倒置_Java设计原则—依赖倒置原则(转)

依赖倒置原则(Dependence Inversion Principle,DIP)的原始定义: 高层模块不应该依赖底层模块,两者都应该依赖其抽象; 抽象不应该依赖细节; 细节应该依赖抽象。 依赖倒置原则在Java语言中的表现是: 模块间的…

设计模式 依赖倒置原则

文章目录 依赖倒置原则依赖倒置原则实战使用依赖倒置原则进行改变案例中两种方式的类图 依赖倒置原则 定义: 程序要依赖于抽象接口, 不要依赖于具体实现, 对抽象进行编程, 而不是对实现进行编程, 降低了客户与实现模块的耦合. 高层模块不应该依赖底层模块, 都应该依赖抽象(接口…

依赖倒置原则应用-司机开车案例

依赖倒置原则 依赖倒置原则(Dependence Inversion Principle)是程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。 依赖倒置原则三层含义: …

4.3 依赖倒置原则

一. 依赖倒置原则的定义 1.核心思想 依赖倒置原则(Dependence Inversion Principle,DIP) *1.高层模块 不应该依赖 低层模块, 二者都应该依赖其抽象; *2.抽象 不应该依赖 细节, 细节 应该依赖 抽象; 接口和抽象类价值在于设计; *3.依赖倒…

C# 依赖倒置原则(DIP)

目录 一,引子 1.1 传统的程序架构 1.2 依赖倒置 1.3 依赖倒置的作用 二,依赖注入 一,引子 1.1 传统的程序架构 在程序执行过程中,传统的程序架构如图: 可以看到,在传统的三层架构中,层与…