【Spring】Spring常见面试题总结

目录

一、Spring框架的基本理解

二、Spring框架主要由哪些模块组成

三、 Spring IOC的理解

四、SpringIOC容器的理解

五、SpringDi的理解

六、什么是Spring的Bean

七、将一个类声明为bean的注解有哪些

八、@Compontent 和 @Bean 的区别 

九、@Autowired和@Resource的区别

十、Spring框架常见的注入方式有几种

十一、Spring中常见的ApplicaionContext实现类有哪些

十二、BeanFactory和ApplicationContext有什么区别

十三、Spring框架中Bean的作用域

十四、Spring框架中Bean的线程安全

十五、Spring框架中Bean的生命周期

十六、Spring框架如何解决循环依赖

十七、Spring框架有哪些注解 

十八、Spring框架中用到的设计模式

十九、Spring框架中AOP的基本理解

二十、Spring AOP 和 AspectJ AOP 有什么区别

二十一、SpringAop有哪些通知类型

二十二、Spring管理事务的方式有几种

二十三、Spring事务中有哪几种事务传播行为

二十四、Spring事务有哪些隔离级别 

二十五、Spring事务在什么情况下会失效

二十六、谈谈对SpringMVC的理解

二十七、SpringMVC的执行流程

二十八、SpringMVC的核心组件有哪些


一、Spring框架的基本理解

Spring框架他是一个轻量级框架,他的核心思想是IOC控制反转AOP面向切面编程,他的主要作用是用于解耦,还可以简化一些第三方中间件的使用比如说,任务调度、缓存等。


二、Spring框架主要由哪些模块组成

核心模块 Core

测试模块 Testing

数据访问模块 Date Access

基于Servlet的应用程序开发 Web Servlet

企业级系统集成模块 Integration


三、 Spring IOC的理解

Spring IOC 是控制反转 是指将创建对象的权力交给Spring管理,由Spring框架根据配置文件或者注解的方式,来创建Bean对象并对Bean对象之间的依赖关系进行管理,以达到松散耦合的关系,实现解耦。


四、SpringIOC容器的理解

IOC容器主要用于创建bean对象,并管理bean对象的生命周期以及bean之间的依赖关系,以达到bean的注入。他的底层是通过ConCurrentHashMap来存储的,key是bean对象Id,value是对象本身。


五、SpringDi的理解

Di是指依赖注入,指每一个Bean在被IOC从容器注入前都会依赖于一个她所需要的另一个Bean对象。


六、什么是Spring的Bean

bean是ioc容器管理的对象


七、将一个类声明为bean的注解有哪些

Controller层 用 @Controller

Service层用 @Service

Dao层用 @Repostory

通用 @Component


八、@Compontent 和 @Bean 的区别 

@Compontent 是用于 而@Bean是用于方法

@Compontent是通过类路径扫描来完成将Bean自动装配到IOC容器中。

@Bean是通过@Bean注解来告诉IOC容器该方法的返回值是一个Bean。


九、@Autowired和@Resource的区别

@Autowired是Spring提供的自动注入注解 他是按类型完成注入,

@Resource是Jdk提供的 他是按名称完成注入。


十、Spring框架常见的注入方式有几种

构造方法注入。

setter方法注入。

成员属性注入,他是通过反射实现,破坏封装不推荐。


十一、Spring中常见的ApplicaionContext实现类有哪些

ClassPathXmlApplicationContext 这个是根据classpath下的配置文件加载bean

FileSystemXmlApplicatioContext 这个是根据当前磁盘下的绝对路径加载bean

AnnotationConfigApplicationContext 这个是根据读取到的注解加载bean

WabApplicationContext 这个是Web容器下按照配置文件加载bean


十二、BeanFactory和ApplicationContext有什么区别

BeanFactoryApplicationContext都是Spring的两大核心接口,都可以当Spring的容器

BeanFactory最底层的接口定了Ioc的基本功能,比如bean的定义、加载、实例化等。

ApplicationContext接口则是BeanFactory的子接口,除了有BeanFactory的功能以外,还有一些其他功能,可以同时加载多个配置文件、可以监听bean的生命周期等。

BeanFactory的话 他是通过延迟加载的,就是只有用到这个bean时,才会对这个bean进行实例化,这样的话就不会提前发现一些不从在的spring配置问题。

而ApplicationContext是在容器启动时一次性创建了所有的bean,这样就会提前发现spring中存在的配置错误,有利于检查所依赖属性是否注入。


十三、Spring框架中Bean的作用域

singleton 单例模式 spring对该bean只会创建唯一实例,默认为单例。

prototype 原型模式 每次获取bean,都会创建一个新的bean实例。

session 会话模式 不同的HTTP会话,都会创建一个新的bean实例。

request 请求模式 不同的请求,都会创建一个新的bean实例。


十四、Spring框架中Bean的线程安全

使用 prototype作用域的话是不存在线程安全的,因为会原型模式的话,每次获取bean都会创建新的实例,不存在bean的共享。

使用singleton作用域的话会是存在线程安全的,因为只会创建一次实例,会发生资源的竞争。

解决方案:

        尽量避免定义可以变的成员变量。

        定义一个ThreadLocal成员变量,将需要可变的成员变量存在ThreadLocal中。


十五、Spring框架中Bean的生命周期

首先是Bean的实例化,通过配置文件或者注解对Bean的定义,利用反射来创建Bean的实例化。

注入对象依赖的属性值。

处理各种Aware接口

执行BeanPostProcessor前置处理,可以通过实现这个接口,可以进行一些自定义的前置处理。

执行InitializingBean初始化方法。

执行init-method自定义初始化方法。

执行BeanPostProcessor后置处理。

最后执行DisposableBean销毁Bean。

执行destory-method自定义销毁方法。


十六、Spring框架如何解决循环依赖

循环依赖指的是类与类之间的依赖关系形成了闭环,则会导致循环依赖问题的产生。

解决方法:

        在Spring中设有三级缓存存储,可以通过三级缓存来解决循环依赖。

        当A实例化对象但尚未初始化,先将A存储到三级缓存中。

        在A进行属性注入时,需要B,则从缓存中查找,没有找到B。

        当B实例化对象也未初始化,先将B也存储到三级缓存中。

        B进行属性注入时,需要A,可以从三级缓存中获取到A,则A从三级缓存进入二级缓存。

        B在执行完其他生命周期后,最终成为一个完整的Bean,存入到一级缓存中,删除掉二三级缓存。

        这时A就可从一级缓存中获取到B,完成注入。

        A执行完其他生命周期后,会从二级缓存存入一级缓存,删除掉二三级缓存。


十七、Spring框架有哪些注解 

首先声明Bean的注解

        @Component @Controller @Service @Repository

用于注入的注解

        @Autowired

声明配置、扫描、启动的注解

        @Configuration 声明配置类 

        @ComponentScan 用于扫描 装配

        @EnableScheduling 启动任务调度

        @EnableAspectJAutoProxy 启动自动代理工厂


十八、Spring框架中用到的设计模式

工厂模式 spring使用工厂模式,通过ApplicationContext和BeanFactory来创建对象。

单例模式 Bean默认的作用域基于单例模式实现。

代理模式 Spring的AOP实现就是依靠动态代理。

策略模式 Resource的实现类,针对不同的资源文件,实现不同方式的资源获取策略。

适配器模式 SpringAop的增强或通知使用到了适配器模式。

模板方法 Spring提供了JdbcTemplate、RedisTemplate等模板对象,将相同操作进行封装。


十九、Spring框架中AOP的基本理解

Aop指的是面向切面编程,其底层是使用动态代理来实现的,将那些逻辑相同的代码封装起来,形成一个可重用的模块,主要是为了防止代码冗余,降低耦合性。

如果这个被代理对象已经实现了某个接口,则是通过反射的方式来创建一个代理对象。

如果没有实现某个接口,则只能通过继承的方式来创建一个子类来做代理对象。


二十、Spring AOP 和 AspectJ AOP 有什么区别

AspectJ是java提供的一个基于面向对象编程的一个独立框架,而Spring AOP是基于这个来实现的,AspectJ的功能更加强大,Spring AOP的话是使用起来比价简单。

SpringAop是运行时增强的,基于动态代理实现。而ASpectJAOP是编译时增强,基于字节码实现。


二十一、SpringAop有哪些通知类型

前置通知 指代码逻辑执行前发生

后置通知 指代码逻辑全部执行后 如果抛出异常 则不发生

异常通知 出现异常时发生

环绕通知 在方法的调用前后自定义发生


二十二、Spring管理事务的方式有几种

一种是通过@Transactional注解来声明事务 一般都是用这种

另一种是自己通过代码手动管理事务


二十三、Spring事务中有哪几种事务传播行为

TransactionDefinition.PROPAGATION_REQUIRED
指如果当前存在事务,则使用当前事务,不存在,则创建一个新的事务

TransactionDefinition.PROPAGATION_REQUIRES_NEW
创建一个新的事务,如果当前存在事务,则当前事务挂起,若不存在,则使用新事物。

TransactionDefinition.PROPAGATION_NESTED
如果当前存在事务,则创建一个新的事务做为该事务的嵌套事务,如果不存在,是使用该事务。

TransactionDefinition.PROPAGATION_MANDATORY
如果当前存在事务,则使用当前事务,如果不存在则抛异常。

TransactionDefinition.PROPAGATION_SUPPORT
如果当前存在事务,则使用当前事务,如果不存在,则不使用事务。

TransactionDefinition.PROPAGATION_NOT_SUPPORTED
不使用事务,如果当前存在事务,则挂起。

TransactionDefinition.PROPAGATION_NEVER
不使用事务,如果当前存在事务,则抛出异常。


二十四、Spring事务有哪些隔离级别 

读未提交 指允许读尚未提交的数据
最低隔离级别,是可能发生脏读、幻读、不可重复读

读已提交 允许读已经提交的数据
可以预防脏读、但仍然可能发生幻读和不可重复读,这个是Oracle的默认隔离级别。

可重复读 对一段数据多次读取结果是重复的 除非自身修改该数据
可以预防脏读和可重复读可能发生幻读,这个是MySql的默认隔离级别。

串行化 所有事务依次执行
最高隔离级别,可以预防脏读、幻读、不可重复读。


二十五、Spring事务在什么情况下会失效

数据不支持事务。

事务方法未被Spring管理,就是事务方法所在的类没有加载到IOC容器中。

方法没有被public修饰。

同一个类中方法相互调用,指A方法声明了事务注解,B方法调用A方法,则B方法事务失效。

 没有配置事务管理器。

方法的事务传播类型不支持事务,比如说PROPAGATION_NOT_SUPPORTED和PROPAGATION_NEVER这两种事务传播方式。

不正常的捕获异常。

错误的标注异常类型。


二十六、谈谈对SpringMVC的理解

首先MVC分别为模型、视图、控制器的简写。他的核心思想就是同过控制器请求、业务逻辑、数据封装、数据显示等节点的流程来写代码。所以这是一种设计模式,SpringMVC就是根据这种设计模式创建的一种框架,能够帮助我们进行更简洁的Web开发。


二十七、SpringMVC的执行流程

客户端发起请求,由核心处理器来拦截请求,核心处理器调用处理器映射器处理器映射器根据uri取匹配查找能处理的请求处理器,将涉及到的拦截器请求处理器一起封装。核心处理器调用处理器适配器适配执行请求处理器请求处理器处理完用户请求后,返回一个模型视图对象给核心处理器,其中包含了数据模型以及视图信息视图解析器会根据视图名称来解析视图文件,并根据视图解析器返回的数据模型传给视图文件,进行渲染,由核心处理器传给客户端浏览器。


二十八、SpringMVC的核心组件有哪些

DispatcherServlet  核心处理器 负责接收请求并转发给其他控制器 最后响应客户端。

HandlerMapping 处理器映射器 根据uri 查找匹配相应的请求处理器,并将拦截器和请求处理器一起封装。

HandlerAdapter 处理器适配器 适配执行对应的请求处理器

Handler 请求处理器 处理实际请求的处理器

ViewResolver 视图解析器 根据返回的逻辑视图名称,解析并渲染真正的视图文件,传递给核心处理器

注:本篇文章都是我自己的理解,可能用词和语句不够严谨,如有错误请评论指正,谢谢!(持续更新中......)