Spring常见面试题总结

1. 谈谈对Spring的理解

  • Spring是一个轻量级的java开发框架,旨在提高开发人员的开发效率和系统的可维护性
  • 主要包括spring core、spring beans、spring context、spring jdbc、spring aop、spring Web、spring test等模块
  • Spring的优点是简化开发,方便解耦;支持AOP编程和声明式事务;方便程序测试和集成优秀框架。缺点是Spring依赖反射,影响性能,学习入门时间较长。
  • 核心就是IOC和AOP,即控制反转和面向切面编程

2. 谈谈对IOC和AOP的理解

  • IOC即控制反转是一种设计思想,就是把对象的控制权交给框架来管理;其中最主要就是通过依赖注入来管理对象;极大的降低了代码量和对象之间是耦合性;其实现机制就是工厂模式和反射机制。
  • AOP即面向切面编程,就是不改变原有业务的基础上,对业务方法进行增强。简单说就是那些与业务无关,却被业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。其实现机制就是动态代理

3. 解释bean的生命周期

注:bean的生命周期是从将bean定义全部注册到BeanFacotry中以后开始的。

  1. Spring对bean进行实例化;
  2. 进行属性注入
  3. 如果实现了一些Aware接口的话,调用接口的方法。(自定义对象获取容器对象)
    1) 如果 bean 实现了 BeanNameAware 接口,调用 setBeanName()方法,传入Bean的名字
    2) 如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入;
    3) 如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来
    4) 与上面的类似,如果实现了其他 *.Aware接口,就调用相应的方法。
  4. 对bean进行初始化(BeanPostProcessor–bean后置处理器)
    1) 如果bean实现BeanPostProcessor接口,执行postProcessBeforeInitialization() 方法
    2) 如果bean实现了InitializingBean接口,执行afterPropertiesSet()方法。类似地,如果bean使用initmethod声明了初始化方法,该方法也会被调用;
    3) 如果bean实现BeanPostProcessor接口,执行postProcessAfterInitialization()方法
  5. 对bean进行销毁
    如果bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用。

4. Spring的启动流程(Ioc容器的启动流程)

1.初始化Spring容器
2.将配置类的BeanDefinition注册到容器中
3.refresh()是AbstractApplicationContext类中的模板方法,其定义了容器启动的主要流程:

  • 进行环境的准备,包括Context的启动时间,活动状态等等;
  • 创建BeanFactory容器,并设置基础属性
  • 加载配置文件,解析bean的定义信息,包装成Beandefinition。
  • 执行BeanFactoryPostProcess,对BeanFactory的相关信息进行扩展。
  • 实例化对象
  • 填充属性
  • 初始化对象
  • 获取对象

5. 循环依赖

  • A创建过程中需要B,于是A将自己放到三级缓里面,去实例化B
  • B实例化的时候发现需要A,于是B先查一级缓存,没有,再查二级缓存,还是没有,再查三级缓存,找到了A然后把三级缓存里面的这个A放到二级缓存里面,并删除三级缓存里面的A
  • B顺利初始化完毕,将自己放到一级缓存里面(此时B里面的A然是创建中状态),然后回来接着创建A,此时B已经创建结束,直接从一级缓存里面拿到B,然后完成创建,并将A自己放到一级缓存里面。

https://blog.csdn.net/a745233700/article/details/110914620

6. BeanFactory 和 ApplicationContext有什么区别?

  • 依赖关系
    BeanFactory是Spring里面最低层的接口,提供了最简单的容器的功能. 通常只提供注册(put),获取(get)这两个功能
    ApplicationContext是BeanFactory的子接口,除了提供BeanFactory所具有的功能外,还提供了更多的框架功能。比如国际化,访问资源(URL、文件),事件机制,对Web应用支持;
  • 加载方式
    BeanFactroy采用的是延迟加载,只有在 调用getBean(),才对该Bean进行加载实例化,占用资源很少但是不能及时发现配置问题
    ApplicationContext在启动的时候就把所有的Bean全部实例化了。系统运行的速度快但是占用内存空间。它可以lazy-init=true来让Bean延迟实例化
  • 注册方式
    两者都支持对bean后置处理器(BeanPostProcessor)、后置工厂处理器(BeanFactoryPostProcessor)的使用,但是BeanFactory需要手动注册,而ApplicationContext则是自动注册。

7. BeanFactory 和 FactoryBean有什么区别?

  • BeanFactory,它是一个工厂类(接口), 它负责生产和管理bean的一个工厂。在Spring中,BeanFactory是IOC容器的核心接口。
  • FactoryBean是一个工厂Bean,可以生成某一个类型Bean实例。最大的一个作用是:可以让我们自定义Bean的创建过程。很重要的三个特性:是否单例、Bean类型、Bean实例
    在这里插入图片描述

8. 常见的依赖注入的实现方式

  • 构造器依赖注入
    通过容器触发一个类的构造器来实现的,不用为属性设置setter方法。
  • Setter方法注入
    调用Bean的默认构造函数实例化Bean对象,然后通过反射的方式调用Setter方法注入属性值。

9. Spring中支持bean的作用域

1)singleton : bean在每个Spring ioc 容器中只有一个实例。
2)prototype:一个bean的定义可以有多个实例。
3)request:每一次HTTP请求都会产生一个新的bean,仅在当前HTTP  
 request内有效。
4)session:每一次HTTP请求都会产生一个新的 bean,仅在当前 HTTP
 session 内有效
5)global-session:全局session作用域,一个bean定义对应一个实例。

10.Spring框架中的单例bean是线程安全的吗?

不是。当多个线程操作同一个对象的时候,对这个对象的非静态成员变量的写操作会存在线程安全问题
解决方法:

  • 改变 bean 的作用域,把“singleton”变更为“prototype”
  • 采用ThreadLocal进行处理。

11. @Autowired注解自动装配的过程

1) byType再byName,首先寻找被@Autowired修饰的方法和属性
2) 如果是方法那就根据方法的参数进行先byType再byName;如果是属性那就根据属性参数先byType再byName。

注意:byType再byName,就是先根据对应类型查询,如果查询到一个,就装配给指定的数据;如果查询到多个,再根据名字进行查找;如果还查询不到,那么会抛出异常。

12. @Component, @Controller, @Repository, @Service 有何区别?

  • @Component :通用的注解,可标注任意类为 Spring 组件。如果一个Bean不知道属于哪个层,可以使用@Component 注解标注。
  • @Repository : 对应持久层即 Dao 层,主要用于数据库相关操作。
  • @Service : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao层。
  • @Controller : 对应 Spring MVC 控制层,主要用户接受用户请求并调用 Service 层返回数据给前端页面。

13. AspectJ AOP and Spring AOP有什么区别?

  • AspectJ是静态代理的增强,所谓静态代理,就是AOP框架会在编译阶段生成AOP代理类,因此也称为编译时增强
  • Spring AOP使用的动态代理,所谓动态代理,就是说AOP框架不会去修改字节码,而是在运行时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理。

14. JDK动态代理和CGLIB动态代理的区别

  • 如果目标对象实现了接口(class userDaoImpl implements userDao),默认情况下会采用JDK的动态代理实现AOP ,核心InvocationHandler接口和Proxy类,InvocationHandler 通过invoke()方法来调用目标类中的代码; Proxy利用 InvocationHandler创建的实例, 生成目标类的代理对象。
  • 如果目标对象没有实现接口,必须采用CGLIB,其主要是对指定的类生成一个子类,覆盖其中的方法。因为是继承,所以该类或方法最好不要声明成final

15. Spring通知有哪些类型?

https://blog.csdn.net/qq_39033181/article/details/115556234

16. Spring 框架中都用到了哪些设计模式?

  • 工厂设计模式 : Spring使用工厂模式通过 BeanFactory、ApplicationContext 创建 bean 对象。
  • 代理设计模式 : Spring AOP 功能的实现。
  • 单例设计模式 : Spring 中的 Bean 默认都是单例的。
  • 模板方法模式 : Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。
  • 适配器模式: 将一个接口转换成客户希望的另一个接口。Spring AOP 的增强或通知(Advice)使用到了适配器模式,即不同的拦截器通过适配器统一对外提供接口。
  • 包装器设计模式 : 装饰者模式可以动态地给对象添加一些额外的属性或行为。我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
  • 观察者模式: 当一个对象发生改变的时候,这个对象所依赖的对象也会做出反应。Spring 事件驱动模型就是观察者模式很经典的一个应用。

17. Spring事务的实现方式有几种?

  • 编程式事务,通过编程的方式管理事务,极大的灵活性,但是难维护。(不推荐使用)
  • 声明式事务,在配置文件中配置(推荐使用)
    声明式事务又分为两种:基于XML的声明式事务;基于注解的声明式事务

18. Spring事务实现的原理?

  Spring只是基于数据库中的事务进行了扩展,提供了一些更加方便操作事务的方式。在一个方法上加了@Transactional注解后,Spring会基于这个类生成一个代理对象,当在使用这个代理对象的方法时,如果这个方法上存在@Transactional注解,那么会先把事务的自动提交设置为false,然后再去执行原本的方法,如果执行业务逻辑方法没有出现异常,那么代理逻辑中就会将事务进行提交,否则会将事务进行回滚。

19. Spring事务的隔离级别

  • ISOLATION_DEFAULT: 使用后端数据库默认的隔离级别。
  • ISOLATION_READ_UNCOMMITTED: 读未提交,最低的隔离级别,允许读取尚未提交的数据变更,但是脏读、幻读或不可重复读有可能发生
  • ISOLATION_READ_COMMITTED: 读已提交,一个事务提交后才能被其他事务读取到,可以阻止脏读,但是幻读或不可重复读仍有可能发生
  • ISOLATION_REPEATABLE_READ: 可重复读,对同一字段的多次读取结果都是一致的,但幻读仍有可能发生。
  • ISOLATION_SERIALIZABLE:序列化,该隔离级别能防止脏读、不可重复读、幻读。

20. Spring事务的传播行为

支持当前事务的情况:

  • PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
  • PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
  • PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。

不支持当前事务的情况:

  • PROPAGATION_REQUIRES_NEW: 创建一个新的事务,如果当前存在事务,则把当前事务挂起。
  • PROPAGATION_NOT_SUPPORTED: 以非事务方式运行,如果当前存在事务,则把当前事务挂起。
  • PROPAGATION_NEVER: 以非事务方式运行,如果当前存在事务,则抛出异常。

其他情况:

  • PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按REQUIRED属性执行。

21. 其他

java基础常见面试题
java集合常见面试题目
JUC并发编程面试题汇总
MySQL数据库常见面试题目
JVM常见面试题总结

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

corlor_龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值