Bean作用域、生命周期

Bean作用域

Bean 的作用域指Bean在spring框架的某种行为模式;Bean的6种作用域分别是以下:
1:单例(Singleton)作用域
2:原型(Prototype)作用域
3:请求(Request)作用域
4:会话(Session)作用域
5:全局(application)作用域
6:HTTP WebSockect 作用域

编写一个测试用例体会一下默认是什么行为模式:

先回顾spring的创建:先创建maven项目;在pom.mxl添加spring依赖;然后添加配置文件;配置扫描路径。等到spring boot就会发现还有摩托车这种好东西;正在骑着的电动车不香了;加油只需几十秒就能跑;电动车则需要充几个小时的电。
在这里插入图片描述
我们按一个标准分层编写这些代码:user是实体;在demo下创建一个enity实体层。userBeans是创建user实例对象要存入spring放在组件里(因为这是额外的东西;我的目的是想在spring有这样一个东西);userController、userController2是分别取出spring的对象进行操作;放在控制层。APP则是启动类。

1:首先有一个user类;里面有id和name属性;使用lombok写一下tostring和get、set方法。
在这里插入图片描述

2:有一个userBeans类;这个类用来把user的一个对象存到spring中;
在这里插入图片描述

3:有一个userController2类;使用注解Autowired把刚才存在spring的对象取出来;并且这里有一个方法printUser;作用是把这个取到的对象进行name属性的修改。
在这里插入图片描述

4:还有一个userController类;在上述修改完成后用Resource再把spring的user对象取出来看看是什么结果。到底有没有被3修改。
在这里插入图片描述

3和4我们要查到结果的话;没办法在main方法使用注解获取;所以我们套娃再把userController、userController2存入spring去;我们在启动类使用三板斧的方式;取出;并执行里面的方法;就可以知道它们用注解取出的user的初始化及修改情况。
0
简单来说a=b;然后我再a=c;结果是a=c;b=c。bean作用域;默认是单例模式;因为它们指向的是同一个地方。两个变量指向同一个引用。单例性能高;反复利用;不要每次用的时候就创建。但是上述的场景不适合;bean状态会被更新。

2.原型模式:prototype;每次对bean的请求都会创建一个新的实例。就比如张三找我借笔记本;我不把我自己用的那本给他;万一你把我乱涂乱画呢;我则是自己去复印店我打印一本一模一样的给他。

3:请求(Request)作用域;每次http请求就会创建新的bean实例;类似上面的prototype(一次http请求是共享bean的)
4:会话(Session)作用域:每次session会话共享一个bean;在一个http session中就定义一个bean实例
5:全局(application)作用域:一个http servletcontext 中共享一个bean
这三种只能在springMVC使用;也叫SpringWeb

6:HTTP WebSockect 作用域;HTTP 请求(通常是短暂的)不同,WebSocket 连接一旦建立,就会持续存在。长连接共享。只适用于Spring WebSocket项目

如何设置行为模式

设置这些行为模式:设置方式有一种;但是写法有两种。在存之前(创建)设置;而不是取的时候
写法1:@Scope(“prototype”)
写法2:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) 这个就是为了避免大家写错搞出来的
设置后的结果:每一份取出来的都是新;第三行的之所以还是弼马温;因为java语法的赋值就是这样子;赋值后是指像同一个引用。
在这里插入图片描述

Bean的生命周期

Spring的执行流程:

Bean 执⾏流程(Spring 执⾏流程):启动 Spring 容器 -> 实例化 Bean(分配内存空间,从⽆到
有) -> Bean 注册到 Spring 中(存操作) -> 将 Bean 装配到需要的类中(取操作)。
1:当你的代码到new这一步;启动spring容器。在启动类的main方法这里
在这里插入图片描述
2:启动的时候会加载配置文件:会去看你有没有配置Bean;有没有配置扫描的路径base-package。如果你配置了就根据你的配置完成bean的初始化(加载的顺序是按你xml代码顺序加载;如果你bean又依赖另一个bean;那就先加载依赖的bean)

3:如果配置了base-package;就会扫描包下所有类有没有加5大类注解;把这些类的对象注册(存)到容器中。

4:取bean;进行对象的装配。进行一个初始化。使用@Autowired、Resource注解。

bean的生命周期

1:实例化bean

开辟内存空间。创建一个空对象;属性还没有被设置

2:设置属性

属性的注入和依赖的注入(比如依赖其它bean;那就得把其它的bean注入)

3:bean初始化

初始化做的很多事情:
3.1 :实现了各种 Aware 通知的⽅法,比如bean的名字设置成功就会有一个BeanNameAware通知的方法;还有其它BeanFactoryAware、ApplicationContextAware 的接⼝⽅法;
3.2:执行初始化的前置方法; BeanPostProcessor
3.3:执行初始化方法(设置了就执行;不设置就不执行)。两种实现方式(第一种XML中的init-method属性;可以自己设置方法名。或者使用 @PostConstruct注解)
3.4:执行后置方法

触发通知

实现一个BeanNameAware通知步骤(s是设置的bean的名称):1.实现BeanNameAware接口2.然后重写setBeanname方法。当然还是需要给Spring容器管理才会触发BeanNameAware的功能。所以我们上面用xml文件bean交给spring管理

在这里插入图片描述

初始化方法实现
xml方式

里面很多属性;init-method就是初始化方法;destroy-methods是销毁方法。
在这里插入图片描述
名字得要一样在这里插入图片描述
在这里插入图片描述

注解方式

在这里插入图片描述

为什么不先初始化后设置属性呢?因为这个属性有可能在初始化的时候被用到;比如下面使用XML配置init-method属性的初始化方法;我在初始化的时候调用属性的方法;如果不先设置属性;那么初始化时候就空指针异常。
在这里插入图片描述

初始化方法作用

在这里插入图片描述
例如:

import javax.annotation.PostConstruct;
import org.springframework.stereotype.Component;

@Component
public class MyBean {

    private String data;

    @PostConstruct
    public void init() {
        // 执行初始化操作;这个方法写在要被注入的对象里;当你装配对象的时候;你写了初始化方法;这会就会执行初始化方法逻辑
        data = "Initialized data";
        // 其他初始化逻辑...
    }

    public String getData() {
        return data;
    }
}

实例化跟初始化区别

实例化是指根据类的定义创建类的对象或实例。通过实例化可以将类的定义转换为具体的对象,使其在内存中占据一定的空间。初始化是指在对象创建后,为其属性赋予初始值或执行其他必要的操作。

4:使用bean

5:销毁bean

销毁方法实现

销毁方法在销毁bean之前执行;也是两种设置方式;xml、注解
在这里插入图片描述
使用bean的时候会自动使用初始化方法这些;但是销毁方法得你手动调用一下才能执行;得使用 ApplicationContext子类ClassPathXmlApplicationContext去拿才能拿到;因为它的子类才有销毁方法
在这里插入图片描述
注解的优先级比xml高。context.destroy();这个方法得调用一下;销毁容器
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Bean 的作用域生命周期Spring 框架中非常重要的两个概念,这里简单介绍一下。 1. Bean 的作用域Spring 中,Bean 的作用域指的是 Bean 实例的创建和销毁的范围。Spring 提供了以下五种作用域: - singleton:单例模式,容器中只有一个 Bean 实例,所有对 Bean 的请求都将返回同一个实例。 - prototype:每次请求都会创建一个新的 Bean 实例。 - request:每个 HTTP 请求都会创建一个新的 Bean 实例。 - session:每个 HTTP Session 都会创建一个新的 Bean 实例。 - global session:基于 Servlet 3.0+ 的环境下,每个全局的 HTTP Session 都会创建一个新的 Bean 实例。 2. Bean 的生命周期 Bean 的生命周期指的是 Bean 实例从创建到销毁的整个过程。Spring 提供了以下七个阶段: - 实例化 Bean:Spring 根据 Bean 的定义创建一个 Bean 的实例。 - 设置 Bean 属性:Spring 将配置文件中的属性设置到 Bean 实例中。 - BeanNameAware:如果 Bean 实现了 BeanNameAware 接口,SpringBean 的 ID 传递给 setBeanName 方法。 - BeanFactoryAware:如果 Bean 实现了 BeanFactoryAware 接口,SpringBeanFactory 实例传递给 setBeanFactory 方法。 - InitializingBean:如果 Bean 实现了 InitializingBean 接口,Spring 将调用 afterPropertiesSet 方法。 - 自定义初始化方法:Bean 可以配置自定义的初始化方法。 - DisposableBean:如果 Bean 实现了 DisposableBean 接口,Spring 将调用 destroy 方法。 - 自定义销毁方法:Bean 可以配置自定义的销毁方法。 以上就是 Spring Bean 的作用域生命周期的简单介绍。理解 Bean 的作用域生命周期对于正确使用 Spring 框架非常重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瞭望~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值