【面试题】10.Spring相关

这篇博客详细探讨了Spring框架的相关面试题,涵盖了Spring的基础、IoC与AOP、事务管理和深入概念。讨论了Spring中bean的作用域、生命周期、注解以及如何处理相同类型的bean注入。此外,还讲解了Spring的IoC容器、AOP概念以及Spring事务的隔离级别和传播行为。最后,提到了SpringBoot的优点、自动配置原理以及run方法的运行流程。
摘要由CSDN通过智能技术生成

10.1 Spring基础

10.1.1 Spring 中的 bean 的作用域有哪些?

  • 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 都有不同的会话。

10.1.2 Spring 中的 bean 生命周期?

  • Spring启动,查找并加载需要被Spring管理的bean,进行Bean的实例化。

  • Bean实例化后对将Bean的引入和值注入到Bean的属性中。

  • 若Bean实现了BeanNameAware接口,Spring将Bean的Id传递给setBeanName()方法

  • 若Bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入

  • 若Bean实现了ApplicationContextAware接口,Spring将调用Bean的setApplicationContext()方法,将bean所在应用上下文引用传入进来。

  • 若Bean实现了BeanPostProcessor接口,Spring就将调用他们的postProcessBeforeInitialization()方法。

  • 若Bean 实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用

  • 若Bean 实现了BeanPostProcessor接口,Spring就将调用他们的postProcessAfterInitialization()方法。

  • 此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。

  • 如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method 声明销毁方法,该方法也会被调用。

  • Spring中的bean生命周期流程图
    Spring中的bean生命周期

  • 使A和B两个bean按顺序加载的方法:初始化之前使用flag检查、使用@DependsOn(“User”)注解、使用@Order(1)注解、实现BeanFactoryPostProcessor接口。

  • Spring Bean循环依赖的解决方式

    • 构造器参数循环依赖:无法解决,只能抛出BeanCurrentlyIn CreationException异常
    • setter方式单例:先是构造实例化Bean对象,将这个实例化的对象放到单例对象工厂的cache(三级缓存)singletonFactories中。二级缓存:earlySingletonObjects ,提前暴光的单例对象的Cache,一级缓存:singletonObjects,单例对象的cache。
    • setter方式原型,prototype:不能解决:Spring容器不会缓存。
  • spring解决循环依赖的实例。比如:单例的bean A 依赖 B,B又依赖A,

    • 创建A,所有缓存中找不到,A实例化后放入三级缓存,A属性赋值,发现B;
    • 创建B,所有缓存中找不到,B实例化后放入三级缓存,B属性赋值,发现A;
    • A在三级缓存中已经存在,然后把A放入二级缓存,从三级缓存中删除,返回A;
    • B初始化:将A注入到B的依赖属性中,B初始化完成;
    • B初始化完成后,B会放入一级缓存中,从三级缓存中删除,返回B;
    • A初始化,将B注入到A的依赖属性中,初始化A完成;
    • A初始化完成后,A会放入一级缓存中,从二级缓存中删除,返回A。
  • BeanPostProcessor和BeanFactoryPostProcessor的区别:BeanPostProcessor是bean级别的处理,针对某个具体的bean进行处理,发生在实例化之后;BeanFactoryPostProcessor是BeanFactory级别的处理,是针对整个Bean的工厂进行处理,发生在实例化之前,刚被解析成BeanDefinition对象。

10.1.3 Spring中bean的注解?

  • 将一个类声明为Spring的 bean 的注解有哪些?
    • @Autowired 注解自动装配 bean,要想把类标识成
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值