Java后端每日面试题(day3)

news/2024/10/5 18:02:30/

目录

  • 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

案例:

java">/*** 业务层实现类*/
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.ppmy.cn/news/1473417.html

相关文章

c++11新特性-7-委托构造函数与继承构造函数

文章目录 委托构造函数继承构造函数 委托构造函数 以前旧版 class Base { public:Base(int age){this->age age;}Base(int age,int num){this->age age;this->num num;}Base(int age,int num,int score){this->age age;this->num num;this->score sco…

浅谈如何在linux上部署java环境

文章目录 一、部署环境1.1、JDK1.2、Tomcat1.3、MySQL 二、将自己写的的程序部署到云服务器上 一、部署环境 为了在linux上部署 Java web 程序,需要安装一下环境。 1.1、JDK 直接使用 yum 命令安装 openjdk。我们 windows系统上 下载的是 oracle 官方的 jdk。而 …

10.10记录

云轴-电话面试 python- 深拷贝和浅拷贝 copy.copy():浅拷贝是创建一个新对象,但是新对象的元素是原对象的引用。也就是说,新对象和原对象共享同一块内存空间。当原对象的元素发生改变时,新对象的元素也会随之改变。 copy.deepco…

Ubuntu / Debian安装FTP服务

本章教程,记录在Ubuntu中安装FTP服务的具体步骤。FTP默认端口:21 1、安装 pure-ftpd sudo apt-get install pure-ftpd2、修改默认配置 # 与 centos 不同,这里需要在 /etc/pure-ftpd/conf 文件夹下执行下列命令,增加对应配置文件: # 创建 /etc/pure-ftpd/conf/PureDB 文件…

494.力扣每日一题6/30 Java(三种解法)

博客主页:音符犹如代码系列专栏:算法练习关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 目录 思路 解题方法 时间复杂度 空间复杂度 Code 解法一:递…

Docker拉取失败,利用 Git将 Docker镜像重新打 Tag 推送到阿里云等其他公有云镜像仓库里

目录 一、开通阿里云容器镜像服务 二、Git配置 三、去DockerHub找镜像 四、编写images.txt文件 ​五、演示 六、其他注意事项 最近一段时间 Docker 镜像一直是 Pull 不下来的状态,想直连 DockerHub 是几乎不可能的。更糟糕的是,很多原本可靠的国内…

Python字符编码检测利器: chardet库详解

Python字符编码检测利器: chardet库详解 1. chardet简介2. 安装3. 基本使用3.1 检测字符串编码3.2 检测文件编码 4. 高级功能4.1 使用UniversalDetector4.2 自定义编码检测 5. 实际应用示例5.1 批量处理文件编码5.2 自动转换文件编码 6. 性能优化7. 注意事项和局限性8. 总结 在…

HY Lisp 读取宏(reader macro)学习

在学习HY lisp语言的时候HY编程快速入门实践课第三章 HY宏入门-CSDN博客,学习到了读取宏(reader macro),尝试将其概念弄明白。 首先,读取宏是Lisp语言中都有的一种概念,所以可以通过任意一种Lisp语言的文档…