Spring中Bean的作用域有哪些?
Bean的作用域:
singleton
:单例,Spring中的bean默认都是单例的。prototype
:多例,每次请求都会创建一个新的bean实例。- request:每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP request内有效。
- session:每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP session内有效。
- 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)等。