BAT大厂Java面试必备10道Spring问题,有你不知道的吗?(含答案)

总结

蚂蚁面试比较重视基础,所以Java那些基本功一定要扎实。蚂蚁的工作环境还是挺赞的,因为我面的是稳定性保障部门,还有许多单独的小组,什么三年1班,很有青春的感觉。面试官基本水平都比较高,基本都P7以上,除了基础还问了不少架构设计方面的问题,收获还是挺大的。


经历这次面试我还通过一些渠道发现了需要大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

蚂蚁金服5面,总结了49个面试题,遇到的面试官都是P7级别以上

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

try

{

Field field = person.getClass().getDeclaredField(fieldName);

// 主要就是这里,需要将属性的 accessible 设置为 true

field.setAccessible(true);

return field.get(person);

}

catch(Exception e)

{

e.printStackTrace();

}

return null;

}

AOP

AOP 的内部原理其实就是动态代理和反射了。主要涉及到的反射类:

在这里插入图片描述

动态代理相关原理的话,你需要了解什么是代理模式、静态代理的不足、动态代理的实现原理。Spring 中实现动态代理有两种方式可选,这两种动态代理的实现方式的一个对比也是面试中常问的。

JDK 动态代理

必须实现 InvocationHandler 接口,然后通过** Proxy.newProxyInstance(ClassLoader**

loader, Class<?>[] interfaces, InvocationHandler h) 获得动态代理对象。

CGLIB 动态代理

使用 CGLIB 动态代理,被代理类不需要强制实现接口。CGLIB 不能对声明为 final的方法进行代理,因为 CGLIB 原理是动态生成被代理类的子类

OK,AOP 讲了。其实讲到这里,可能会有一个延伸的面试问题。我们知道,Spring事物也是 通 过 AOP 来 实 现的 , 我们使用的时候 一 般就是在方法上 加@Tranactional 注解,那么你有没有遇到过事物不生效的情况呢?这是为什么?这个问题我们在后面的面试题中会讲。

2.Spring Bean 生命周期


在这里插入图片描述

这只是个大体流程,内部的具体行为太多,需要自行去看看代码。

3.Spring Bean 注入是如何解决循环依赖问题的


3.1. 什么是循环依赖,有啥问题?

循环依赖就是 N 个类中循环嵌套引用,这样会导致内存溢出。循环依赖主要分两种:

  • 构造器循环依赖
  • setter 循环依赖

3.2. Spring 解决循环依赖问题

  • 构造器循环依赖问题

无解,直接抛出 BeanCurrentlyInCreatingException 异常。

  • setter 循环依赖问题

单例模式下,通过“三级缓存”来处理。非单例模式的话,问题无解。

Spring 初始化单例对象大体是分为如下三个步骤的:

  • createBeanInstance:调用构造函数创建对象
  • populateBean:调用类的 setter 方法填充对象属性
  • initializeBean:调用定义的 Bean 初始化 init 方法

可以看出,循环依赖主要发生在 1、2 步,当然如果发生在第一步的话,Spring 也是无法解决该问题的。那么就剩下第二步 populateBean 中出现的循环依赖问题。通过“三级缓存”来处理,三级缓存如下:

  • **singletonObjects:**Cache of singleton objects: bean name --> bean instance,完成初始化的单例对象的 cache(一级缓存)
  • **earlySingletonObjects:**Cache of early singleton objects: bean name–> bean instance ,完成实例化但是尚未初始化的,提前暴光的单例对象的 cache (二级缓存)
  • singletonFactories : Cache of singleton factories: bean name -->ObjectFactory,进入实例化阶段的单例对象工厂的 cache (三级缓存)

我们看下获取单例对象的方法:

protected Object getSingleton(String beanName, boolean allowEarlyReference)

{

Object singletonObject = this.singletonObjects.get(beanName);

// isSingletonCurrentlyInCreation:判断当前单例 bean 是否正在创建中

if(singletonObject == null && isSingletonCurrentlyInCreation(beanName))

{

synchronized(this.singletonObjects)

{

singletonObject = this.earlySingletonObjects.get(beanName);

// allowEarlyReference:是否允许从 singletonFactories 中通过 getObject 拿到

对象

if(singletonObject == null && allowEarlyReference)

{

ObjectFactory <? > singletonFactory = this.singletonFactories.get(beanName);

if(singletonFactory != null)

{

singletonObject = singletonFactory.getObject();

this.earlySingletonObjects.put(beanName, singletonObject);

this.singletonFactories.remove(beanName);

}

}

}

}

return(singletonObject != NULL_OBJECT ? singletonObject : null);

}

其中解决循环依赖问题的关键点就在 singletonFactory.getObject() 这一步,getObject 这是 ObjectFactory 接口的方法。Spring 通过对该方法的实现,在createBeanInstance 之后,populateBean 之前,通过将创建好但还没完成属性设置和初始化的对象提前曝光,然后再获取 Bean 的时候去看是否有提前曝光的对象实例来判断是否要走创建流程。

protected void addSingletonFactory(String beanName, ObjectFactory <? > singletonFactory)

{

Assert.notNull(singletonFactory, “Singleton factory must not be null”);

synchronized(this.singletonObjects)

{

if(!this.singletonObjects.containsKey(beanName))

{

this.singletonFactories.put(beanName, singletonFactory);

this.earlySingletonObjects.remove(beanName);

this.registeredSingletons.add(beanName);

}

}

}

4.Spring 事务为何失效了


可能的原因:

  1. MySQL 使用的是 MyISAM 引擎,而 MyISAM 是不支持事务的。需要支持使用可以使用 InnoDB 引擎
  1. 如果使用了 Spring MVC ,context:component-scan 重复扫描问题可能会引起事务失败
  1. @Transactional 注解开启配置放到 DispatcherServlet 的配置里了。
  1. @Transactional 注解只能应用到 public 可见度的方法上。 在其他可见类型上声明,事务会失效。
  1. 在接口上使用 @Transactional 注解,只能当你设置了基于接口的代理时它才生效。所以如果强制使用了
CGLIB,那么事物会实效。
  1. @Transactional 同一个类中无事务方法 a() 内部调用有事务方法 b(),那么此时事物不生效。

按 理 说 , 如 果 按 照 Spring 说 的 事 物 传 播 级 别 去 配 置 其 事 物 级 别 为REQUIRES_NEW 的话,那么应该是在调用 b() 的时候会新生成一个事物。实际上却没有。

在这里插入图片描述在这里插入图片描述

NOT_SUPPORTED 总是非事务地执行,并挂起任何存在的事务其实,这是由于 Spring 的事物实现是通过 AOP 来实现的。此时,当这个有注解的方法 b() 被调用的时候,实际上是由代理类来调用的,代理类在调用之前就会启动 transaction。然而,如果这个有注解的方法是被同一个类中的其他方法 a() 调用的,那么该方法的调用并没有通过代理类,而是直接通过原来的那个 bean,所以就不会启动 transaction,我们看到的现象就是 @Transactional 注解无效。

5.怎样用注解的方式配置 Spring?


Spring 在 2.5 版本以后开始支持用注解的方式来配置依赖注入。可以用注解的方式来替代XML 方式的 bean 描述,可以将 bean 描述转移到组件类的内部,只需要在相关类上、方法上或者字段声明上使用注解即可。注解注入将会被容器在 XML 注入之前被处理,所以后者会覆盖掉前者对于同一个属性的处理结果。注解装配在 Spring 中是默认关闭的。所以需要在 Spring 文件中配置一下才能使用基于注解的装配模式。如果你想要在你的应用程序中使用关于注解的方法的话,请参考如下的配置。

context:annotation-config/

在标签配置完成以后,就可以用注解的方式在 Spring 中向属性、方法和构造方法中自动装配变量。

下面是几种比较重要的注解类型:

  • @Required:该注解应用于设值方法。
  • @Autowired:该注解应用于有值设值方法、非设值方法、构造方法和变量。
  • @Qualifier:该注解和@Autowired 注解搭配使用,用于消除特定 bean 自动装配的歧义。
  • JSR-250 Annotations:Spring 支持基于 JSR-250 注解的以下注解,@Resource、@PostConstruct 和@PreDestroy。

6、SpringMVC 的流程?


  1. 用户发送请求至前端控制器 DispatcherServlet;

  2. DispatcherServlet 收到请求后,调用 HandlerMapping 处理器映射器,请求获取Handle

  3. 处理器映射器根据请求 url 找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给

DispatcherServlet;

  1. DispatcherServlet 调用 HandlerAdapter 处理器适配器;

  2. HandlerAdapter 经过适配调用 具体处理器(Handler,也叫后端控制器);

  3. Handler 执行完成返回 ModelAndView;

  4. HandlerAdapter 将 Handler 执 行 结 果 ModelAndView 返 回 给DispatcherServlet

  1. DispatcherServlet 将 ModelAndView 传 给ViewResolver 视图解析器进行解析;

  2. ViewResolver 解析后返回具体View;

  3. DispatcherServlet 对 View 进行渲染视图(即将模型数据填充至视图中)

  4. DispatcherServlet 响应用户。

在这里插入图片描述

7、Springmvc 的优点:


  1. 可以支持各种视图技术,而不仅仅局限于 JSP;

  2. 与 Spring 框架集成(如 IoC 容器、AOP 等);

写在最后

学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!

最后再分享的一些BATJ等大厂20、21年的面试题,把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。

蚂蚁金服三面直击面试官的Redis三连,Redis面试复习大纲在手,不慌

Mybatis面试专题

蚂蚁金服三面直击面试官的Redis三连,Redis面试复习大纲在手,不慌

MySQL面试专题

蚂蚁金服三面直击面试官的Redis三连,Redis面试复习大纲在手,不慌

并发编程面试专题

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。

[外链图片转存中…(img-d3wRkfSR-1715813586675)]

Mybatis面试专题

[外链图片转存中…(img-itl0b7N4-1715813586675)]

MySQL面试专题

[外链图片转存中…(img-A0H6cGHi-1715813586676)]

并发编程面试专题

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 29
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值