Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day15】—— Spring框架1

本文介绍了Spring框架的关键组件,如SpringJMS、SpringORM、SpringWeb和SpringTest,重点阐述了IoC(控制反转)的概念,以及bean的作用域、生命周期和线程安全性。此外,还详细解读了SpringMVC的运行流程。内容还包括Java开发的学习资源和提升路径。
摘要由CSDN通过智能技术生成

Spring JMS:负责Java消息服务。

Spring ORM:用于支持常用的Hibernate,Mybatis等框架,Spring本身并不对ORM进行实现,仅对常见的ORM框架进行封装,并对其进行管理;

Spring Web:WEB模块提供对常见框架如Struts X,SpringMVC,JSF的支持,Spring能够管理这些框架,将Spring的资源注入给框架,也能在这些框架的前后插入拦截器。

Spring Test:提供了对JUnit和TestNG测试的支持。

Core Container中的Core组件是Spring所有组件的核心,Beans组件和Context组件是实现IOC和DI的基础,AOP组件用来实现面向切面编程。

追问1:常见的Core组件有哪些?


  • IoC Container,控制反转容器

  • Events,事件编程

  • Resources,资源加载

  • i18n,国际化

  • Validation,校验

  • Data Binding,数据绑定

  • Type Conversion,类型转换

  • SpEL,Spring 表达式

  • AOP,面向切面编程


在这里插入图片描述

课间休息,又来秀一下来自咱们群里同学的搬砖工地,坐标:上海 朱家角

作者:🇨 🇭 🇪 🇳 🇬


面试题2:谈谈对Spring IOC的理解

====================================================================================

IOC(Inversion Of Controll,控制反转)是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由给Spring框架来管理。

IOC在其他语言中也有应用,并非Spring特有。IOC容器是Spring用来实现IOC的载体,IOC容器实际上就是一个Map(key, value),Map中存放的是各种对象。

在这里插入图片描述

将对象之间的相互依赖关系交给IOC容器来管理,并由IOC容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。IOC容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。在实际项目中一个Service类可能由几百甚至上千个类作为它的底层,假如我们需要实例化这个Service,可能要每次都搞清楚这个Service所有底层类的构造函数,这是不现实的。如果利用IOC的话,你只需要配置好,然后在需要的地方引用就行了,大大增加了项目的可维护性且降低了开发难度。

Spring时代我们一般通过XML文件来配置Bean,后来开发人员觉得用XML文件来配置不太友好,于是Sprng Boot注解配置就慢慢开始流行起来。

推荐:Spring IOC 容器源码分析(IOC详细总结)

追问1:Spring中的bean的作用域有哪些?


spring 支持 5 种作用域,如下:

  • singleton:唯一bean实例,Spring中的bean默认都是单例的。

  • prototype:每次请求都会创建一个新的bean实例。

  • request:每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP request内有效。

  • session:每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP session内有效。

  • global-session:全局session作用域,仅仅在基于Portlet的Web应用中才有意义,Spring5中已经没有了。Portlet是能够生成语义代码(例如HTML)片段的小型Java Web插件。它们基于Portlet容器,可以像Servlet一样处理HTTP请求。但是与Servlet不同,每个Portlet都有不同的会话。

追问2:Spring中的bean生命周期?


  1. Bean容器找到配置文件中Spring Bean的定义。

  2. Bean容器利用Java Reflection API创建一个Bean的实例。

  3. 如果涉及到一些属性值,利用set()方法设置一些属性值。

  4. 如果Bean实现了BeanNameAware接口,调用setBeanName()方法,传入Bean的名字。

在这里插入图片描述

  1. 如果Bean实现了BeanClassLoaderAware接口,调用setBeanClassLoader()方法,传入ClassLoader对象的实例。

  2. 如果Bean实现了BeanFactoryAware接口,调用setBeanClassFacotory()方法,传入ClassLoader对象的实例。

  3. 与上面的类似,如果实现了其他*Aware接口,就调用相应的方法。

  4. 如果有和加载这个Bean的Spring容器相关的BeanPostProcessor对象,执行postProcessBeforeInitialization()方法。

  5. 如果Bean实现了InitializingBean接口,执行afeterPropertiesSet()方法。

  6. 如果Bean在配置文件中的定义包含init-method属性,执行指定的方法。

  7. 如果有和加载这个Bean的Spring容器相关的BeanPostProcess对象,执行postProcessAfterInitialization()方法。

  8. 当要销毁Bean的时候,如果Bean实现了DisposableBean接口,执行destroy()方法

  9. 当要销毁Bean的时候,如果Bean在配置文件中的定义包含destroy-method属性,执行指定的方法。

追问3: Spring 中的 bean 是线程安全的吗?


Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,但是具体还是要结合具体scope的Bean去研究。

结合上面提到的Spring bean 的作用域(scope)

  1. 对于prototype作用域的Bean,每次都创建一个新对象,也就是线程之间不存在Bean共享,因此不会有线程安全问题。

  2. 对于singleton作用域的Bean,所有的线程都共享一个单例实例的Bean,因此是存在线程安全问题的。但是如果单例Bean是一个无状态Bean,也就是线程中的操作不会对Bean的成员执行查询以外的操作,那么这个单例Bean是线程安全的。比如Controller类、Service类和Dao等,这些Bean大多是无状态的,只关注于方法本身。

  • 有状态Bean(Stateful Bean) :就是有实例变量的对象,可以保存数据,是非线程安全的
  • 无状态Bean(Stateless Bean):就是没有实例变量的对象,不能保存数据,是不变类,是线程安全的

线程安全这个问题,要从单例与原型Bean分别进行说明。

对于有状态的bean(比如ModelAndView),就需要自行保证线程安全,最浅显的解决办法就是将有状态的bean的作用域由“singleton”改为“prototype”。也可以采用ThreadLocal解决线程安全问题,为每个线程提供一个独立的变量副本,不同线程只操作自己线程的副本变量。

ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。

  • 同步机制:采用了“时间换空间”的方式,仅提供一份变量,不同的线程在访问前需要获取锁,没获得锁的线程则需要排队。

  • ThreadLocal:采用了“空间换时间”的方式。ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。


在这里插入图片描述

课间休息,又来秀一下来自咱们群里同学的搬砖工地,坐标:济南 遥墙机场

作者:對你何止一句钟意


面试题3:说一下 SpringMVC 运行流程?

=======================================================================================

在这里插入图片描述

流程说明:

  1. 客户端(浏览器)发送请求,直接请求到DispatcherServlet。

  2. DispatcherServlet根据请求信息调用HandlerMapping,解析请求对应的Handler

  3. 解析到对应的Handler(也就是我们平常说的Controller控制器)。

  4. HandlerAdapter会根据Handler来调用真正的处理器(对应的接口)来处理请求和执行相对应的业务逻辑。

  5. 处理器处理完业务后,会返回一个ModelAndView对象,Model是返回的数据对象,View是逻辑上的View。

  6. ViewResolver(视图解析器)会根据逻辑View去查找实际的View。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

在面试前我整理归纳了一些面试学习资料,文中结合我的朋友同学面试美团滴滴这类大厂的资料及案例

MyBatis答案解析
由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

大家看完有什么不懂的可以在下方留言讨论也可以关注。

觉得文章对你有帮助的话记得关注我点个赞支持一下!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
链图片转存中…(img-t0HU8ffV-1713441921167)]

[外链图片转存中…(img-EbKW0bPc-1713441921168)]
由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

大家看完有什么不懂的可以在下方留言讨论也可以关注。

觉得文章对你有帮助的话记得关注我点个赞支持一下!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 22
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值