Bean 作用域和生命周期

Bean 的作用域

先通过下述代码来感受下 Bean 的作用域

有一个 User 类:

java 复制代码
package com.java.demo.entity;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter // 通过这个注解,lombok 会自动生成 get 方法
@Setter // 通过这个注解,lombok 会自动生成 set 方法
@ToString // 通过这个注解,lombok 会自动生成 toString 方法
public class User {
    private int id;
    private String name;
}

初始化 Bean 对象然后存到 spring 中:

java 复制代码
package com.java.demo.component;

import com.java.demo.entity.User;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

@Component
public class UserBeans {
    @Bean
    public User GetUser() {
        User user = new User();
        user.setName("赵云");
        user.setId(1);
        return user;
    }
}

然后使用两个不同的类去获取 Bean

java 复制代码
package com.java.demo.controller;

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

@Controller
public class UserController {
    @Autowired
    private User user;
    public void print() {
        System.out.println("user" + user);  // 打印一下最开始的内容
        User user1 = user;
        user1.setName("关羽");
        user1.setId(2);
        System.out.println("user1" + user1); // 打印一下新对象的内容
        System.out.println("user" + user); // 打印一下刚传进来的 Bean 的内容
    }
}
java 复制代码
package com.java.demo.controller;

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

@Controller
public class UserController2 {
    @Autowired
    private User user;
    // 这个类不做任何操作,只是去获取 spring 中的 Bean
    public void print() {
        System.out.println("user" + user);

    }
}

运行后发现:一个地方改了,这个 Bean 就变了,已经不是原来的值了

这是因为 Bean 默认情况下是单例状态(singleton),也就是所有地方的使⽤的都是同⼀个对象,因为单例可以很大程度上提高性能,所以在 Spring 中 Bean 的作⽤域默认就是 singleton 单例模式。

关于 Bean 的 6 种作用域

在普通的 Spring 项⽬中只有前两种,后 4 种状态是 Spring MVC 中的值

singleton:单例作用域

这是 spring 的默认模式,是为了实现更高的性能。该作⽤域下的Bean在IoC容器中只存在⼀个实例。通常使用这个作用域表示 Bean 对象的属性状态不需要更新。

prototype:原型作用域(多例作用域)

可以通过在存 Bean 的时候使用注解 @Scope() 来设置成多例作用域。每次对该作⽤域下的Bean的请求都会创建新的实例。当Bean 对象的属性状态需要更新的时候使用这个。

request:请求作用域

每次http请求会创建新的Bean实例,类似于 prototype。⼀次http的请求和响应的共享 Bean。【 SpringMVC 的限定皮肤】

session:回话作用域

在⼀个 http session 中,定义⼀个 Bean 实例。每次 session 会话共享 Bean,⽐如:记录⼀个⽤户的登陆信息。【 SpringMVC 的限定皮肤】

application:全局作用域(不常用)

在⼀个 http servlet Context 中,共享⼀个 Bean 实例。【 SpringMVC 的限定皮肤】

websocket:HTTP WebSocket 作用域(更不常用)

网络长连接,只适用于 spring WebSocket 中。

相关推荐
啊唯不困16 小时前
AI智能应用开发(Java)起点-终点 -1、java的前世今生andJava环境配置、jdk下载,以及Idea下载和基本应用
java·开发语言·intellij-idea
_muffinman16 小时前
Java学习笔记-第2章 运算和语句
java·笔记·学习
荒夜长歌16 小时前
传统java行业跳槽面试汇总(后续会更新)
java·面试·跳槽
旷世奇才李先生16 小时前
065智慧农业专家远程指导系统-springboot+vue
java·vue.js·spring boot
大迪deblog16 小时前
系统架构设计-软件架构风格
java·开发语言·架构·软件构建
盐水冰16 小时前
【烘焙坊项目】后端搭建(10) - 地址簿功能&用户下单&微信支付
java·数据库·后端
重庆小透明16 小时前
【面试问题】java小厂
java·开发语言·面试
xindon1216 小时前
如何集成单点登录和设计子系统的权限管理三
java
zuoerjinshu17 小时前
【SpringBoot】讲清楚日志文件&&lombok
java·spring boot·后端
Je1lyfish17 小时前
CMU15-445 (2026 Spring) Project#2 - B+ Tree
linux·数据结构·数据库·c++·sql·spring·oracle