面试整理——Spring和SpringMVC

Spring和SpringMVC

第一部分 Spring

1.1 Spring基础

问:Spring常用模块?

  • Spring Core:框架的最基础部分,提供 IoC 容器,对 bean 进行管理。
  • Spring Context:继承 BeanFactory ,提供上下文信息,扩展出 JNDIEJB 、电子邮件、国际化等功能。
  • Spring DAO:提供了 JDBC 的抽象层,还提供了声明性事务管理方法。
  • Spring ORM:提供了 JPAJDOHibernateMyBatis 等ORM映射层(Object Relational Mapping,对象关系映射)。
  • Spring AOP:集成了所有 AOP 功能。
  • Spring Web:提供了基础的 Web 开发的上下文信息,现有的Web框架,如 JSFTapestryStructs 等,提供了集成。
  • Spring Web MVC:提供了 Web 应用的 Model-View-Controller 全功能实现。

问:Spring和Spring MVC的关系?

Spring可以看作一个集成了多种特性、多种功能模块的平台(如IoC、AOP、事务、ORM等)。

MVC模型则是一个Web框架不可缺少的内容,Spring MVC就是建立在Spring平台上的MVC模型,需要基于Spring支撑才能运行。

spring的作用;

26、spring循环依赖怎么解决(说出三级缓存源码细节);

27、spring aop原理(动态代理)、

28、spring bean生命周期(源码细节,以及各个位置的设计思路,有什么可扩展的)

\2. Spring介绍一下

\3. SpringMVC工作流程

\28. Spring里面的设计模式

12、讲一讲Spring和Springboot的区别


1.2 Spring Bean

问:讲一讲Spring Bean是什么?

在Spring中,构成应用程序主干并由 Spring IoC 容器所管理的对象,被称之为bean。bean是由 IoC 容器初始化、装配及管理的对象。

问:Spring Bean定义5种作用域?

  • singleton(单例):Spring IoC 容器中仅存在一个Bean实例,Bean以单例的形式存在。
  • prototype(原型):每次从容器中调用Bean时,都返回一个新的实例,即每次调用 getBean() 时,相当于执行 new XxxBean()
  • request :每次HTTP请求都会创建一个新的Bean,该作用域仅适用于 WebApplicationContext 环境。
  • session :同一个 HTTP Session 共享一个Bean,不同Session使用不同Bean,仅适用于 WebApplicationContext 环境。
  • global session:一般用于 Portlet 应用环境,仅适用于 WebApplicationContext 环境。

问:讲一下Bean的创建过程?

问:说说Spring的生命周期吧?

问:讲一下Spring Bean的生命周期?

Spring Bean

  • 实例化Bean: Ioc容器通过获取BeanDefinition对象中的信息进行实例化,实例化对象被包装在BeanWrapper对象中
  • 设置对象属性(DI):通过BeanWrapper提供的设置属性的接口完成属性依赖注入;
  • 注入Aware接口(BeanFactoryAware, 可以用这个方式来获取其它 Bean,ApplicationContextAware):Spring会检测该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入给bean
  • BeanPostProcessor:自定义的处理(分前置处理和后置处理)
  • InitializingBean和init-method:执行我们自己定义的初始化方法
  • 使用
  • destroy:bean的销毁

问:讲一下bean成员变量的参数注入有哪种方式?

Spring Bean

问:讲一下Spring的单例是怎么实现的?Spring Bean是如何注入的?单例的情况下怎么实例化,什么时候,多例呢?Spring 怎么解决单例 Bean 的循环依赖问题?

问:怎么检测是否存在循环依赖?Spring如解决Bean循环依赖问题?

Bean在创建的时候可以给该Bean打标,如果递归调用回来发现正在创建中的话,即说明了循环依赖了。

Spring中循环依赖场景有:

  • 构造器的循环依赖
  • 属性的循环依赖
  • singletonObjects:第一级缓存,里面放置的是实例化好的单例对象; earlySingletonObjects:第二级缓存,里面存放的是提前曝光的单例对象; singletonFactories:第三级缓存,里面存放的是要被实例化的对象的对象工厂
  • 创建bean的时候Spring首先从一级缓存singletonObjects中获取。如果获取不到,并且对象正在创建中,就再从二级缓存earlySingletonObjects中获取,如果还是获取不到就从三级缓存singletonFactories中取(Bean调用构造函数进行实例化后,即使属性还未填充,就可以通过三级缓存向外提前暴露依赖的引用值(提前曝光),根据对象引用能定位到堆中的对象,其原理是基于Java的引用传递),取到后从三级缓存移动到了二级缓存完全初始化之后将自己放入到一级缓存中供其他使用,
  • 因为加入singletonFactories三级缓存的前提是执行了构造器,所以构造器的循环依赖没法解决。
  • 构造器循环依赖解决办法:在构造函数中使用@Lazy注解延迟加载。在注入依赖时,先注入代理对象,当首次使用时再创建对象说明:一种互斥的关系而非层次递进的关系,故称为三个Map而非三级缓存的缘由 完成注入;

1.3 Spring IoC

问:讲一下ioc的原理与初始化流程?Spring 对于 IOC 的扩展点有哪些?

控制反转(Inversion of Control),即IOC。将对象的创建通过依赖注入的方式由 Spring IoC容器来实现。

流程:resource定位 即寻找用户定义的bean资源,由 ResourceLoader通过统一的接口Resource接口来完成 beanDefinition载入 BeanDefinitionReader读取、解析Resource定位的资源 成BeanDefinition 载入到ioc中(通过HashMap进行维护BD) BeanDefinition注册 即向IOC容器注册这些BeanDefinition, 通过BeanDefinitionRegistery实现

问:BeanDefinition加载流程?

定义BeanDefinitionReader解析xml的document BeanDefinitionDocumentReader解析document成beanDefinition

问:讲一下依赖注入?

问:Spring的IOC注入方式?

构造器注入 setter方法注入 注解注入 接口注入

问:DI依赖注入流程? (实例化,处理Bean之间的依赖关系)依赖注入怎么处理bean之间的依赖关系?

过程在Ioc初始化后,依赖注入的过程是用户第一次向IoC容器索要Bean时触发

  • 如果设置lazy-init=true,会在第一次getBean的时候才初始化bean, lazy-init=false,会容器启动的时候直接初始化(singleton bean);
  • 调用BeanFactory.getBean()生成bean的;
  • 生成bean过程运用装饰器模式产生的bean都是beanWrapper(bean的增强);

依赖注入怎么处理bean之间的依赖关系? 其实就是通过在beanDefinition载入时,如果bean有依赖关系,通过占位符来代替,在调用getbean时候,如果遇到占位符,从ioc里获取bean注入到本实例来

问:Spring IOC是怎么管理bean的?给你spring的jar包你要怎么让它启动?


1.4 Spring AOP

问:讲一下Spring AOP 的原理,及代理对象调用过程(责任链+递归调用)?动态代理与CGlib的区别?

问:AOP 核心概念?

  1. 切面(aspect):类是对物体特征的抽象,切面就是对横切关注点的抽象
  2. 横切关注点:对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点。
  3. 连接点(joinpoint):被拦截到的点,因为 Spring 只支持方法类型的连接点,所以在Spring 中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器。
  4. 切入点(pointcut):对连接点进行拦截的定义
  5. 通知(advice):所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类。
  6. 目标对象:代理的目标对象
  7. 织入(weave):将切面应用到目标对象并导致代理对象创建的过程
  8. 引入(introduction):在不修改代码的前提下,引入可以在运行期为类动态地添加方法或字段。

问:解释一下AOP?AOP 主要应用场景?

传统oop开发代码逻辑自上而下的,这个过程中会产生一些横切性问题,这些问题与我们主业务逻辑关系不大,会散落在代码的各个地方,造成难以维护,aop思想就是把业务逻辑与横切的问题进行分离,达到解耦的目的,提高代码重用性和开发效率;

  • 记录日志
  • 监控性能
  • 权限控制
  • 事务管理
  • 线程池关闭

问:AOP源码分析?

  • @EnableAspectJAutoProxy给容器(beanFactory)中注册一个AnnotationAwareAspectJAutoProxyCreator对象;
  • AnnotationAwareAspectJAutoProxyCreator对目标对象进行代理对象的创建,对象内部,是封装JDK和CGlib两个技术,实现动态代理对象创建的(创建代理对象过程中,会先创建一个代理工厂,获取到所有的增强器(通知方法),将这些增强器和目标类注入代理工厂,再用代理工厂创建对象);
  • 代理对象执行目标方法,得到目标方法的拦截器链,利用拦截器的链式机制,依次进入每一个拦截器进行执行

问:AOP使用哪种动态代理?

  • 当bean的是实现中存在接口或者是Proxy的子类,—jdk动态代理;不存在接口,spring会采用CGLIB来生成代理对象;
  • JDK 动态代理主要涉及到 java.lang.reflect 包中的两个类:Proxy 和 InvocationHandler。
  • Proxy 利用 InvocationHandler(定义横切逻辑) 接口动态创建 目标类的代理对象

1.5 其他

问:讲一下Spring事务管理机制及执行流程?

Spring为事务管理提供了一致的编程模板,在高层次建立了统一的事务抽象,像Spring DAO为不同的持久化提供了模板类一样,Spring也提供了事务模板类TransactionTemplate。通过模板类并配合使用事务回调TransactionCallback指定具体的持久化操作,就可以通过编程方式实现事务管理,而无需关注资源获取、复用、释放、事务同步和异常处理等操作。

问:讲一下spring常用的注解有哪些?作用?@Autowired和@Resource的区别?

问:spring提供的扩展组件有用过吗?比如拦截器?说下这个拦截器的api?还有没用过其它的组件?

问:登录态怎么去处理的?

问:Spring 使用了哪些设计模式?

  • 工厂模式: spring中的BeanFactory就是简单工厂模式的体现,根据传入唯一的标识来获得bean对象;
  • 单例模式: 提供了全局的访问点BeanFactory;
  • 代理模式: AOP功能的原理就使用代理模式(1、JDK动态代理。2、CGLib字节码生成技术代理。)
  • 装饰器模式: 依赖注入就需要使用BeanWrapper;
  • 观察者模式: spring中Observer模式常用的地方是listener的实现。如ApplicationListener。
  • 策略模式: Bean的实例化的时候决定采用何种方式初始化bean实例(反射或者CGLIB动态字节码生成)

Spring 中经典的 9 种设计模式


第二部分 Spring MVC

问:讲一下SpringMVC的全流程,可以画一下UML时序图吗?

  1. 客户发送请求url
  2. DispatcherServlet前置控制器,查找请求映射处理器
  3. HandlerMapping请求映射,返回结果处理器,即被映射的bean()。DispatcherServlet查找适配处理器
  4. HandlerAdapter请求映射,对处理器进行适配,以使其能正确处理请求。DispatcherServlet调用处理器
  5. Controller控制器,返回封装后的ModelAndView。DispatcherServlet通过视图解析器进行查找
  6. HandlerIntercepter拦截器
  7. ViewResolver视图映射,返回视图结果。DispatcherServlet解析视图
  8. View视图处理,将结果返回给用户

(1):用户请求发送给DispatcherServlet,DispatcherServlet调用HandlerMapping处理器映射器;

(2):HandlerMapping根据xml或注解找到对应的处理器,生成处理器对象返回给DispatcherServlet;

(3):DispatcherServlet会调用相应的HandlerAdapter;

(4):HandlerAdapter经过适配调用具体的处理器去处理请求,生成ModelAndView返回给DispatcherServlet

(5):DispatcherServlet将ModelAndView传给ViewReslover解析生成View返回给DispatcherServlet;

(6):DispatcherServlet根据View进行渲染视图;

->DispatcherServlet->HandlerMapping->Handler ->DispatcherServlet->HandlerAdapter处理handler->ModelAndView ->DispatcherServlet->ModelAndView->ViewReslover->View ->DispatcherServlet->返回给客户

问:讲一下SpringMVC不同用户登录的信息怎么保证线程安全的?

问:讲一下SpringMVC的执行流程?


参考内容均来自网络中网友分享,若内容涉及侵权请及时告知,我会尽快修改和删除相关内容