高频:spring知识

1、bean的生命周期?

主要阶段

初始化

org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh

信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@67424e82: startup date []; root of context hierarchy

org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions

信息: Loading XML bean definitions from class path resource [spring-bean.xml]

{BeanFactoryPostProcessor} 【Constructor】 Method

{BeanFactoryPostProcessor} 【postProcessBeanFactory】 Method

{InstantiationAwareBeanPostProcessor} 【Constructor】 Method

{BeanPostProcessor} 【Constructor】 Method

{InstantiationAwareBeanPostProcessor} 【postProcess[Before]Instantiation】 Method

{AccountBean} 【Constructor】 Method

{InstantiationAwareBeanPostProcessor} 【postProcess[After]Instantiation】 Method

{InstantiationAwareBeanPostProcessor} 【postProcessPropertyValues】 Method,[Bean] = AccountBean{accountNo='null', openDate='null'}, [BeanName] = accountBean

{AccountBean} 的【setAccountNo】方法

{AccountBean} 的【setOpenDate】方法

{BeanNameAware} 的【setBeanName】方法

{BeanFactoryAware} 的【setBeanFactory】方法

{InstantiationAwareBeanPostProcessor} 【postProcess[Before]Initialization】 Method

{BeanPostProcessor} 的【postProcess[Before]Initialization】方法【beanName】: accountBean

{InitializingBean} 的【afterPropertiesSet】方法

{AccountBean} 的【init-method】方法

{InstantiationAwareBeanPostProcessor} 【postProcess[After]Initialization】Method

{BeanPostProcessor} 的【postProcess[After]Initialization】方法【beanName】: accountBean

AccountBean{accountNo='00001', openDate='2017-12-05'}

关闭

org.springframework.context.support.ClassPathXmlApplicationContext doClose

信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@67424e82: startup date [Sun Dec 10 15:35:01 CST 2017]; root of context hierarchy

{DisposableBean} 的【destroy】方法

{AccountBean} 的【destroy-method】方法

2、三级缓存是如何解决循环依赖的?

三级缓存

Spring 三级缓存指的是 Spring 在解决循环依赖问题时所采用的三级缓存机制,分别是:

1. 一级缓存:单例对象缓存(Singleton Objects Cache),用于存储已经创建好的单例 Bean 实例。缓存键为 Bean 名称,值为 Bean 实例。

2. 二级缓存:早期单例对象缓存(Early Singleton Objects Cache),用于存储已经实例化但尚未完成初始化的早期 Bean 实例。缓存键为 Bean 名称,值为 Bean 实例。

3. 三级缓存:单例对象工厂缓存(Singleton Objects Factory Cache),用于存储创建单例 Bean 实例的工厂对象。缓存键为 Bean 名称,值为 ObjectFactory 实例。

这三级缓存协同工作,解决了 Spring 容器中单例 Bean 的循环依赖问题。

执行流程

在 Spring 创建 Bean 的过程中,会在以下阶段将 Bean 放入三级缓存:

1. 一级缓存:当 Bean 完全创建好并完成初始化后,Spring 会将其放入一级缓存。这意味着 Bean 已经被填充了属性值,执行了初始化方法(如 `@PostConstruct` 注解的方法或 `afterPropertiesSet()` 方法),并且应用了相关的 Bean 后置处理器。

2. 二级缓存:当 Bean 实例化完成(通过构造器创建实例)但尚未完成初始化时,Spring 会将其放入二级缓存。这意味着 Bean 已经创建了实例,但尚未填充属性值和执行初始化方法。

3. 三级缓存:在 Bean 实例化之前,Spring 会将创建 Bean 实例的工厂对象(`ObjectFactory`)放入三级缓存。这个工厂对象负责创建和初始化 Bean 实例。

3、AOP实现原理?

什么是AOP?

  1. AOP 是 Aspect Oriented Programming(面向切面编程) 的简称,和OOP(面向对象编程)一样是一种编程思想,是对OOP的一种补充。

  2. AOP旨在将横切关注点(crosscutting concern)从业务主体逻辑中进行剥离,实现关注点分离,以提高程序的模块化程度(及业务模块只需关注业务逻辑,无需关注日志、安全、事务等通用逻辑)

Spring AOP的动态代理有2种实现方式

  1. JDK动态代理(JDKDynamicAopProxy):基于接口实现,底层基于反射

  2. CGLIB动态代理(CGLIBAopProxy):基于继承实现

Spring 如何选择动态代理方式 ?(以Spring 4.3.17为例)

源码见:DefaultAopProxyFactory - > createAopProxy

  • 当代理对象实现了接口时,Spring默认使用JDK的动态代理。

  • 当Bean没有实现接口时,Spring默认使用CGLIB动态代理。

  • 当代理对象实现了接口时,也可以强制使用CGLIB(在spring配置中加入<aop:aspectj-autoproxy proxy-target-class="true"/>)

相关推荐

  1. 音视频高频知识

    2024-03-14 18:42:03       55 阅读
  2. Spring存储基础知识

    2024-03-14 18:42:03       42 阅读
  3. Spring核心知识

    2024-03-14 18:42:03       42 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-14 18:42:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-14 18:42:03       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-14 18:42:03       82 阅读
  4. Python语言-面向对象

    2024-03-14 18:42:03       91 阅读

热门阅读

  1. 【Redis内存数据库】NoSQL的特点和应用场景

    2024-03-14 18:42:03       45 阅读
  2. C#(C Sharp)学习笔记_变量常量与作用域【十二】

    2024-03-14 18:42:03       43 阅读
  3. 常用的git命令

    2024-03-14 18:42:03       39 阅读
  4. vue2、vue3 request请求删除接口用formData传参记录

    2024-03-14 18:42:03       38 阅读
  5. Ubuntu系统安装MySQL主从模式集群(成功!)

    2024-03-14 18:42:03       45 阅读
  6. Linux--家目录stu

    2024-03-14 18:42:03       39 阅读
  7. 访问者模式在量化交易系统开发的应用

    2024-03-14 18:42:03       49 阅读
  8. Linux移动文件夹和文件指令

    2024-03-14 18:42:03       37 阅读
  9. Linux异步通知实验:应用程序对异步通知的处理

    2024-03-14 18:42:03       53 阅读
  10. 快速配置ssh免密登录

    2024-03-14 18:42:03       43 阅读
  11. BIO、NIO、AIO有什么区别?

    2024-03-14 18:42:03       40 阅读
  12. 将LibMTL应用于自定义模型

    2024-03-14 18:42:03       37 阅读