Spring Bean作用域与生命周期

这篇具有很好参考价值的文章主要介绍了Spring Bean作用域与生命周期。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

Bean的作用域:

Bean有六大行为模式

1、singleton:单例模式(默认)

2、prototype: 原型模式(多例模式)

3、request: 请求作用域(Spring MVC)

4、session: 会话作用域(Spring MVC)

5、application: 全局作用域(Spring MVC)

6、websocket: HTTP WebSocket 作用域(Spring WebSocket)

applicationContext和singleton的区别 

Bean的生命周期 

1、实例化(给Bean分配内存空间) 

2、设置属性(对象注入)

3、Bean的初始化 

4、使用Bean

5、销毁Bean 

总结:


Bean的作用域:

一般情况下,对于变量的可用范围叫做作用域,或者说是定义某个变量的区域叫做作用域。 

而Bean的作用域指的是Bean在Spring容器中的行为模式。

Bean有六大行为模式

1、singleton:单例模式(默认)

singleton是Bean在Spring中默认的行为,这个默认的行为模式就是说一个类只有一个Bean对象,所有的用户都使用的同一个对象,如果有一个用户对这个对象进行了修改,那么所有的结果都会发生改变。

如:这样一个User类:

package com.demo.spring.beans;

public class User {
    private int Id;
    private String name;

    public int getId() {
        return Id;
    }

    public void setId(int id) {
        Id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "Id=" + Id +
                ", name='" + name + '\'' +
                '}';
    }
}

我们先使用@Bean注解给Spring中注入一个User对象 

package com.demo.spring.beans.Controller.Bean;

import com.demo.spring.beans.User;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Controller;

@Controller
public class UserBean {
    
    @Bean(name = "user")
    //使用getUser方法返回Bean对象
    public User getUser(){
        User user=new User();
        user.setId(1);
        user.setName("张三");
        return user;
    }
}

 然后使用@Autowired从Spring中获取到该Bean对象并进行修改:

package com.demo.spring.beans.Controller;

import com.demo.spring.beans.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class UserController {
    private User user1;
    @Autowired
    public User getUser1(){
        User user=user1;
        user.setId(1);
        user.setName("李四");
        return user;
    }

}

然后再使用@Autowired直接从Spring中获取Bean对象:

package com.demo.spring.beans.Controller;

import com.demo.spring.beans.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class UserController2 {
    @Autowired
    private User user3;
    public User getUser3() {
        return user3;
    }
}

然后我们在App启动类中分别获取一下UserController和UserController2的Bean对象:

import com.demo.spring.beans.Controller.UserController;
import com.demo.spring.beans.Controller.UserController2;
import com.demo.spring.beans.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        ApplicationContext context=new
                ClassPathXmlApplicationContext("spring-config.xml");
        UserController userController=  context.getBean("userController", UserController.class);
        User user=userController.getUser1();
        System.out.println("修改后的bean:"+ user);
        UserController2 userController2=context.getBean("userController2",UserController2.class);
        User user1=userController2.getUser3();
        System.out.println("最后获取的bean:"+user1);
    }
}

结果如图:

Spring Bean作用域与生命周期 也就是说,开始的时候我们的name是张三,经过第一次修改后,变成了李四,最后一个人在没有修改的前提下依然获得的是李四 。所以我们可以断定这个bean是同一个。也就是说Bean的作用域默认是Singleton(单例模式)单例可以节省内存开销,适合Bean对象不被随意更改的场景。

2、prototype: 原型模式(多例模式)

原型模式需要在注入Bean的时候就进行指定,需要在@Bean注解下或者五大类注解的下面指定注解:@Scope,并且在注解中指定一个值为prototype。这样其他地方获取Bean的时候,就不是同一个了,而是一个新的Bean实例。(通常有状态的Bean使用该作用域) 

Spring Bean作用域与生命周期 Spring Bean作用域与生命周期

Bean的内容容易被修改的场景中适合使用该种作用域。

3、request: 请求作用域(Spring MVC)

每次http请求会创建新的Bean实例,类似于prototype

场景:⼀次http的请求和响应的共享Bean

备注:限定SpringMVC中使⽤

4、session: 会话作用域(Spring MVC)

在⼀个http session中,定义⼀个Bean实例

场景:⽤户回话的共享Bean, ⽐如:记录⼀个⽤户的登陆信息

备注:限定SpringMVC中使⽤

5、application: 全局作用域(Spring MVC)

在⼀个http servlet Context中,定义⼀个Bean实例(这个Bean也是单例的)

场景:Web应⽤的上下⽂信息,⽐如:记录⼀个应⽤的共享信息

备注:限定SpringMVC中使⽤

6、websocket: HTTP WebSocket 作用域(Spring WebSocket)

在⼀个HTTP WebSocket的⽣命周期中,定义⼀个Bea实例

场景:WebSocket的每次会话中,保存了⼀个Map结构的头信息,将⽤来包裹客户端消息头。第⼀次初始化后,直WebSocket结束都是同⼀个Bean。

备注:限定Spring WebSocket中使⽤

applicationContext和singleton的区别 

1、作用域不一样:singleton是Spring Core的作用域,而application是Spring Web中的作用域。

2、作用的容器不一样:singleton是作用于Spring IOC的容器,而application是作用于Servlet的容器。

Bean的生命周期 

1、实例化(给Bean分配内存空间) 

2、设置属性(对象注入)

3、Bean的初始化 

①执行各种通知(执行各种 Aware)
②执行初始化的前置方法(BeanPostProcessor)
③ 执行构造方法,两种执行方式,一种是执行 @PostConstruct,另一种实质性 init-method
④ 执行初始化的后置方法(BeanPostProcessor)

4、使用Bean

5、销毁Bean 

执行销毁容器的各种方法,例如@PreDestroyDisposableBean方法destroy-method方法

总结:

Spring Bean作用域与生命周期文章来源地址https://www.toymoban.com/news/detail-431212.html

到了这里,关于Spring Bean作用域与生命周期的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Bean的作用域及生命周期

    目录 前言: Bean的作用域(Scope) 单例模式 原型模式(多例作用域) 请求作用域(request) 会话作用域 全局作用域 网络长连接 Spring执行流程 Bean的生命周期 测试 小结:     使用Spring框架时,我们需要清楚Spring托管Bean的作用域和生命周期,这样使用框架才会更加得心应手。

    2024年02月03日
    浏览(24)
  • Bean 作用域、生命周期和Spring执行流程

    假设现在有⼀个公共的 Bean,提供给 A ⽤户和 B ⽤户使⽤,然⽽在使⽤的途中 A ⽤户却“悄悄”地修改了公共 Bean 的数据,导致 B ⽤户在使⽤时发⽣了预期之外的逻辑错误。 我们可以看到,B 用户在使用这个Bean对象时,得到的Dog是被A 用户修改过的,这无疑会给 B 用户带来很

    2024年02月12日
    浏览(35)
  • 【Spring】Bean的作用域和生命周期

    目录 一、引入案例来探讨Bean的作用域 二、Bean的作用域 2.1、Bean的6种作用域 2.2、设置Bean的作用域 三、Spring的执行流程  四、Bean的声明周期 1、生命周期演示 首先我们创建一个User类,定义一个用户信息,在定义一个Users类,使用方法注解将user存入Spring中,然后两个用户A对这

    2024年02月14日
    浏览(32)
  • Spring Bean的作用域和生命周期

    Bean 的作用域指的是 Bean 在 Spring 容器中的行为(Bean 实例创建及生命周期),它的行为是由 Spring 来管理的,可以根据具体情况选择不同的作用域来达到性能优化、资源利用最大化和可维护性等目的。 Bean 作用域(Scope)类型主要有如下几种: 其中前两种是 Spring 核心作用域,

    2024年02月12日
    浏览(44)
  • Spring中Bean的作用域和Spring生命周期

    从前面的文章中我们看出Spring是用来存储和读取Bean的,因此Spring中Bean是最核心的资源,所以我们将对Bean进行深入的理解。 现在有一个公共的Bean,提供给了两个用户去使用,但是在使用过程中,用户一修改了公共的Bean数据,当用户2在使用时,却发现产生了逻辑上的错误。

    2024年02月16日
    浏览(34)
  • 5、Spring之bean的作用域和生命周期

    5.1.1.1、配置bean 注意:当bean不配置scope属性时,默认是singleton(单例) 5.1.1.2、测试 由控制台日志可知,此时ioc获取到的两个bean本质上是同一个对象 5.1.2.1、配置bean 5.1.2.2、测试 由控制台日志可知,此时ioc获取到的两个bean本质上是不同的对象 如果是在WebApplicationContext环境下

    2024年02月14日
    浏览(30)
  • Spring系列4 -- Bean的作用域和生命周期

    目录 1. 案例 2. 作用域定义 2.1 Bean的6种作用域 2.2 设置作用域 3. Sring的执行流程 4. Bean的生命周期 思考: 为什么不是先进行初始化然后再进行设置属性呢?         假设现在有⼀个公共的 Bean,提供给 A ⽤户和 B ⽤户使⽤,然⽽在使⽤的途中 A ⽤户却“悄悄”地修改了公共

    2024年02月15日
    浏览(27)
  • 【Spring 】执行流程解析:了解Bean的作用域及生命周期

     哈喽,哈喽,大家好~ 我是你们的老朋友: 保护小周ღ    今天给大家带来的是 Spring 项目的执行流程解析  和 Bean 对象的6 种作用域 以及 生命周期 , 本文将为大家讲解,一起来看看叭~ 本期收录于博主的专栏 :JavaEE_保护小周ღ的博客-CSDN博客 适用于编程初学者,感兴趣

    2024年02月16日
    浏览(29)
  • 【JavaEE】深入了解Spring中Bean的可见范围(作用域)以及前世今生(生命周期)

    【JavaEE】Spring的开发要点总结(4) 在学习Spring中,Bean是最核心的操作资源 使用学习Bean对象是一个重点,我们已经知道如何存储它,获取它,现在我们要知道: 它的作用域,我们才可以知道怎么使用,才能得心应手,符合预期~ 它的生命周期,我们才能更加清楚的了解它的

    2024年02月14日
    浏览(36)
  • 【Spring学习】Bean对象的作用域和生命周期,了解了这些你就真正熟悉spring框架了.

    前言: 大家好,我是 良辰丫 ,我们已经学会了Spring的存取,今天我们将一起来学习Bean对象的作用域和生命周期.💌💌💌 🧑个人主页:良辰针不戳 📖所属专栏:javaEE进阶篇之框架学习 🍎励志语句:生活也许会让我们遍体鳞伤,但最终这些伤口会成为我们一辈子的财富。 💦期

    2024年02月07日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包