Java后端开发面试题——框架篇

Spring框架中的bean是单例的吗?Spring框架中的单例bean是线程安全的吗?

singleton : bean在每个Spring IOC容器中只有一个实例。

prototype:一个bean的定义可以有多个实例。

Spring bean并没有可变的状态(比如Service类和DAO类),所以在某种程度上说Spring的单例bean是线程安全的

如果在bean中定义了可修改的成员变量,是要考虑线程安全问题的,可以使用多例或者加锁来解决

Spring中的事务是如何实现的

编程式事务控制:需使用TransactionTemplate来进行实现,对业务代码有侵入性,项目中很少使用

声明式事务管理:声明式事务管理建立在AOP之上的。其本质是通过AOP功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,也就是在目标方法开始之前加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务

Spring中事务失效的场景有哪些

异常捕获处理,自己处理了异常,没有抛出,解决:手动抛出

抛出检查异常,配置rollbackFor属性为Exception

非public方法导致的事务失效,改为public

Spring的bean的生命周期

通过BeanDefinition获取bean的定义信息

调用构造函数实例化bean

bean的依赖注入

处理Aware接口(BeanNameAware、BeanFactoryAware、ApplicationContextAware)

Bean的前置处理器BeanPostProcessor-前置

初始化方法(InitializingBean、init-method)

Bean的后置处理器BeanPostProcessor-后置

销毁bean

Spring中的循环引用

循环依赖:循环依赖其实就是循环引用,也就是两个或两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于A

循环依赖在spring中是允许存在,spring框架依据三级缓存已经解决了大部分的循环依赖

一级缓存:单例池,缓存已经经历了完整的生命周期,已经初始化完成的bean对象

二级缓存:缓存早期的bean对象(生命周期还没走完)

三级缓存:缓存的是ObjectFactory,表示对象工厂,用来创建某个对象的

java 复制代码
//单实例对象注册器
public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry 
    implements SingletonBeanRegistry {
    private static final int SUPPRESSED_EXCEPTIONS_LIMIT = 100;
    private final Map<String, Object> singletonObjects = new ConcurrentHashMap(256);
    private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap(16);
    private final Map<String, Object> earlySingletonObjects = new ConcurrentHashMap(16);
}

构造方法出现了循环依赖怎么解决?

使用@Lazy进行懒加载,什么时候需要对象再进行bean对象的创建

java 复制代码
public A(@Lazy B b){
    System.out.println("A的构造方法执行了...");
    this.b = b ;
}

Springboot自动配置原理

在Spring Boot项目中的引导类上有一个注解@SpringBootApplication,其中@EnableAutoConfiguration是实现自动化配置的核心注解。 该注解通过@Import注解导入对应的配置选择器。 内部就是读取了该项目和该项目引用的Jar包的的classpath路径下META-INF/spring.factories文件中的所配置的类的全类名。 在这些配置类中所定义的Bean会根据条件注解所指定的条件来决定是否需要将其导入到Spring容器中。 条件判断会有像@ConditionalOnClass这样的注解,判断是否有对应的class文件,如果有则加载该类,把这个配置类的所有的Bean放入spring容器中使用。

Spring框架常见注解(Spring、Springboot、Springmvc)

Mybatis是否支持延迟加载?延迟加载的底层原理知道吗?

延迟加载的意思是:就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。

(查询用户的时候,把用户所属的订单数据也查询出来,这个是立即加载 查询用户的时候,暂时不查询订单数据,当需要订单的时候,再查询订单,这个就是延迟加载)

Mybatis支持一对一关联对象和一对多关联集合对象的延迟加载

在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false,默认是关闭的

使用CGLIB创建目标对象的代理对象

当调用目标方法时,进入拦截器invoke方法,发现目标方法是null值,执行sql查询

获取数据以后,调用set方法设置属性值,再继续查询目标方法,就有值了

Mybatis的一级、二级缓存用过吗?

一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session(指sqlSession),当Session进行flush或close之后,该Session中的所有Cache就将清空,默认打开一级缓存

二级缓存是基于namespace和mapper的作用域起作用的,不是依赖于SQL session,默认也是采用 PerpetualCache,HashMap 存储。需要单独开启,一个是核心配置,一个是mapper映射文件

二级缓存需要缓存的数据实现Serializable接口

只有会话提交或者关闭以后,一级缓存中的数据才会转移到二级缓存中

当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了新增、修改、删除操作后,默认该作用域下所有 select 中的缓存将被 clear。

相关推荐
一 乐几秒前
校园二手交易|基于springboot + vue校园二手交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
KIKIiiiiiiii1 分钟前
微信个人号API二次开发中的解决经验
java·人工智能·python·微信
梵刹古音2 分钟前
【C语言】 指针基础与定义
c语言·开发语言·算法
80530单词突击赢2 分钟前
SpringBoot整合SpringMVC全解析
java·spring boot·后端
Ekehlaft5 分钟前
这款国产 AI,让 Python 小白也能玩转编程
开发语言·人工智能·python·ai·aipy
rit84324997 分钟前
MATLAB中Teager能量算子提取与解调信号的实现
开发语言·matlab
开源技术10 分钟前
Python GeoPandas基础知识:地图、投影和空间连接
开发语言·ide·python
vx1_Biye_Design12 分钟前
基于Spring Boot+Vue的学生管理系统设计与实现-计算机毕业设计源码46223
java·vue.js·spring boot·spring·eclipse·tomcat·maven
vx_Biye_Design13 分钟前
基于Spring Boot+vue的湖北旅游景点门票预约平台的设计--毕设附源码29593
java·vue.js·spring boot·spring cloud·servlet·eclipse·课程设计
Cult Of14 分钟前
Alicea Wind的个人网站开发日志(2)
开发语言·python·vue