当前位置: 首页 > news >正文

Java后端每日面试题(day3)

目录

  • Spring中Bean的作用域有哪些?
  • Spring中Bean的生命周期
  • Bean 是线程安全的吗?
  • 了解Spring Boot中的日志组件吗?

Spring中Bean的作用域有哪些?


Bean的作用域:

  1. singleton:单例,Spring中的bean默认都是单例的。
  2. prototype:多例,每次请求都会创建一个新的bean实例。
  3. request:每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP request内有效。
  4. session:每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP session内有效。
  5. global-session:全局session作用域。

Spring中Bean的生命周期


生命周期

Bean生命周期可以粗略的划分为五大步:

  • 第一步:实例化Bean
  • 第二步:Bean属性赋值
  • 第三步:初始化Bean
  • 第四步:使用Bean
  • 第五步:销毁Bean

案例:

/*** 业务层实现类*/
public class UserServiceImpl implements UserService {private UserDao userDao;public UserServiceImpl() {System.out.println("调用构造方法创建bean...");}public void setUserDao(UserDao userDao) {System.out.println("调用set方法注入值...");this.userDao = userDao;}public void init(){System.out.println("调用init方法初始化bean...");}public void destroy(){System.out.println("调用destroy方法销毁bean...");}public void addUser(){userDao.addUser();}
}
  • 生命周期
  • 单例(singleton):[容器启动]—>构造方法(实例化)—>set方法(注入)—>init方法(初始化)—>[容器关闭]—>destroy方法(销毁)
  • 多例(prototype):[使用对象]---->构造方法(实例化)—>set方法(注入)—>init方法(初始化)—>[JVM垃圾回收]—>destroy方法(销毁)

Bean 是线程安全的吗?


Spring 框架中的 Bean 是否线程安全,取决于其作用域状态

以最常用的两种作用域 prototype(多例) 和 singleton (单例)为例介绍。几乎所有场景的 Bean 作用域都是使用默认的 singleton ,重点关注 singleton 作用域即可。

  • prototype 作用域下,每次获取都会创建一个新的 bean 实例,不存在资源竞争问题所以不存在线程安全问题

  • singleton 作用域下,IoC 容器中只有唯一的 bean 实例,可能会存在资源竞争问题(取决于 Bean 是否有状态)。

    • 有状态Bean(包含可变的成员变量的对象),存在线程安全问题
    • 无状态Bean(没有定义可变的成员变量,比如dao和service),不能保存数据,是线程安全的。

了解Spring Boot中的日志组件吗?


在Spring Boot中,日志组件的设计遵循了门面模式(Facade Pattern)的概念。

门面模式是一种结构型设计模式,它提供了一个统一的接口来访问子系统中的一群接口。这可以简化客户端与子系统之间的交互,同时提供了一层抽象,使系统更加灵活和易于维护。

在日志处理方面,Spring Boot使用SLF4J(Simple Logging Facade for Java)作为门面

SLF4J是一个抽象层,它为Java平台上的多种日志框架提供了一个统一的接口

这意味着开发人员在编写代码时,只需调用SLF4J的API,而不需要关心底层具体使用的是哪种日志框架,如Logback、Log4j、Log4j2、JUL(Java Util Logging)等。

http://www.lryc.cn/news/392497.html

相关文章:

  • [单master节点k8s部署]18.监控系统构建(三)Grafana安装
  • 【JavaScript脚本宇宙】优化你的Web色彩:精选JavaScript颜色工具对比
  • 用html+css设计一个列表清单小卡片
  • day11_homework_need2submit
  • 昇思MindSpore学习总结九——FCN语义分割
  • js数据库多级分类按树形结构打印
  • centos下编译安装redis最新稳定版
  • 如何让自动化测试更加灵活简洁?
  • linux 下载依赖慢和访问github代码慢
  • 奥比中光astra_pro相机使用记录
  • 【MindSpore学习打卡】应用实践-计算机视觉-深入解析 Vision Transformer(ViT):从原理到实践
  • Debezium系列之:支持在一个数据库connector采集中过滤某些表的删除事件
  • SQL Server端口配置指南:最佳实践与技巧
  • FastGPT 报错:undefined 该令牌无权使用模型:gpt-3.5-turbo (request id: xxx)
  • springboot系列八: springboot静态资源访问,Rest风格请求处理, 接收参数相关注解
  • # 职场生活之道:善于团结
  • go sync包(五) WaitGroup
  • 基于深度学习的相机内参标定
  • 适合金融行业的国产传输软件应该是怎样的?
  • 昇思25天学习打卡营第9天|MindSpore使用静态图加速(基于context的开启方式)
  • class类和style内联样式的绑定
  • 3033.力扣每日一题7/5 Java
  • GPT-5:下一代AI如何彻底改变我们的未来
  • 重载一元运算符
  • 10元 DIY 一个柔性灯丝氛围灯
  • 表单自定义组件 - 可选择卡片SelectCard
  • Ubuntu / Debian安装FTP服务
  • 若依 Vue 前端分离 3.8.8 版中生成的前端代码中关于下拉框只有下拉箭头的问题
  • C++把一个类封装成动态链接库
  • 每天一个项目管理概念之项目章程