Spring常见面试题总结

1、Spring是什么?

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)。

2、Spring的IoC理解:

控制反转,把对象创建的过程和对象之间的调用过程交给spring管理。
底层原理:xml解析,工厂模式,反射。
单例模式:单例模式要求某一类能够有返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称)。
饿汉式,懒汉式

工厂模式:为创建对象提供过渡接口,以便将创建对象的具体过程(new 关键字和具体的构造器)隐藏起来。用一个工厂方法来替代,对外提供的只是一个工厂方法,达到提高灵活性的目的。
在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。该核心类成为一个抽象工厂角色,
仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。
工厂模式

反射:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;
这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

Bean管理:spring创建对象,spring注入属性
Spring的IOC有三种注入方式 :构造器注入、set方法注入、根据注解注入。

3、BeanFactory和ApplicationContext有什么区别?

BeanFactroy:spring内部的子接口,不提供开发人员使用。
ApplicationContext是BeanFactory的子接口,一般由开发人员使用

4、Spring Bean的生命周期?

实例化 --> 属性赋值 --> 初始化 --> 销毁

5、 Spring中bean的作用域:

作用域

6、Spring框架中的Bean是线程安全的么?如果线程不安全,那么如何处理?

Spring容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,但是具体情况还是要结合Bean的作用域来讨论。
(1)对于prototype作用域的Bean,每次都创建一个新对象,也就是线程之间不存在Bean共享,因此不会有线程安全问题。
(2)对于singleton作用域的Bean,所有的线程都共享一个单例实例的Bean,因此是存在线程安全问题的。但是如果单例Bean是一个无状态Bean,也就是线程中的操作不会对Bean的成员执行查询以外的操作,那么这个单例Bean是线程安全的。比如Controller类、Service类和Dao等,这些Bean大多是无状态的,只关注于方法本身。
对于有状态的bean(比如Model和View),就需要自行保证线程安全,最浅显的解决办法就是将有状态的bean的作用域由“singleton”改为“prototype”。
也可以采用ThreadLocal解决线程安全问题,为每个线程提供一个独立的变量副本,不同线程只操作自己线程的副本变量。

7、Spring的自动装配:

(1)在Spring框架xml配置中共有5种自动装配:
no:默认的方式是不进行自动装配的,通过手工设置ref属性来进行装配bean。
byName:通过bean的名称进行自动装配,如果一个bean的 property 与另一bean 的name 相同,就进行自动装配。 
byType:通过参数的数据类型进行自动装配。
constructor:利用构造函数进行装配,并且构造函数的参数通过byType进行装配。
autodetect:自动探测,如果有构造方法,通过 construct的方式自动装配,否则使用 byType的方式自动装配。
2)基于注解的自动装配方式:

使用@Autowired、@Resource注解来自动装配指定的bean。在使用@Autowired注解之前需要在Spring配置文件进行配置,<context:annotation-config />。在启动spring IoC时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowied、@Resource或@Inject时,就会在IoC容器自动查找需要的bean,并装配给该对象的属性。在使用@Autowired时,首先在容器中查询对应类型的bean:

8、Spring的AOP理解:面向切面编程,不修改源码进行主干功能增强。

AOP实现的关键在于 代理模式,AOP代理主要分为静态代理和动态代理。静态代理的代表为AspectJ;动态代理则以Spring AOP为代表。
动态代理的角色和静态代理的一样 ,动态代理的代理类是动态生成的 . 静态代理的代理类是我们提前写好的
Spring AOP中的动态代理主要有两种方式,(有接口的情况下)JDK动态代理和(没有接口的情况下)CGLIB动态代理

9、Spring AOP里面的几个名词的概念



10.事务

事务就是把一系列的动作当成一个独立的工作单元,这些动作要么全部完成,要么全部不起作用。
事务四个属性ACID
原子性(atomicity)
事务是原子性操作,由一系列动作组成,事务的原子性确保动作要么全部完成,要么完全不起作用
一致性(consistency)
一旦所有事务动作完成,事务就要被提交。数据和资源处于一种满足业务规则的一致性状态中
隔离性(isolation)
可能多个事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏
持久性(durability)
事务一旦完成,无论系统发生什么错误,结果都不会受到影响。通常情况下,事务的结果被写到持久化存储器中

我们一般都是将事务的边界设置在Service层,
那么当我们调用Service层的一个方法的时,它能够保证我们的这个方法中执行的所有的对数据库的更新操作保持在一个事务中,
在事务层里面调用的这些方法要么全部成功,要么全部失败。那么事务的传播特性也是从这里说起的。
如果你在你的Service层的这个方法中,还调用了本类的其他的Service方法,那么在调用其他的Service方法的时候,这个事务是怎么规定的呢?
必须保证在我方法里调用的这个方法与我本身的方法处在同一个事务中,否则无法保证事物的一致性。

参考链接
Spring常见面试题总结:https://blog.csdn.net/a745233700/article/details/80959716

posted @ 2021-03-03 11:22  君甚秀  阅读(5477)  评论(0编辑  收藏  举报