Spring 原理 (面试题)

本文围绕Spring展开,介绍了其启动过程,包含容器刷新前准备、创建容器对象等步骤;阐述了AOP机制,涉及创建代理、拦截目标和调用代理对象阶段;说明了Bean生命周期,从实例化到销毁的各环节;还讲解了Spring事务,包括隔离级别、使用方法和默认事务能力等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


提示:以下是本篇文章正文内容,Java系列学习将会持续更新

一、Spring 启动过程

  1. 第一步,首先会执行一些容器刷新前的准备工作,如设置容器启动时间、一些状态标志位等
  2. 第二步,创建容器对象,其实就是实例化 DefaultListableBeanFactory对象,这一步包含了 bean定义信息的解析
  3. 第三步,准备Bean工厂,实际上就是设置 beanFactory 的一些属性
  4. 第四步,为上下文初始化 MessageSource,即 国际化处理;
  5. 第五步,注册 Listener 监听器
  6. 第六步,实例化所有非懒加载的单实例 Bean
  7. 第七步,Spring容器完成刷新,发布事件:ContextRefreshedEvent

二、AOP 机制

  1. 创建代理对象阶段
    ①创建 Bean 实例从 getBean() 开始;Spring容器将根据AOP的配置去匹配目标类的类名,看目标类是否符合切面规则。
    ②调用 ProxyFactory 去创建 Bean,缓存到 IoC 容器中。
    ③根据对象选择不同的代理策略。如果目标类实现了接口,调用JDK的 Proxy;没有实现接口,则调用 CGLib Proxy
  2. 拦截目标对象阶段
    当用户调用目标对象的某个方法时,将会被 AOP Proxy 的对象拦截。该对象默认实现了InvocationHandler 接口,invoke() 方法会按顺序执行 AOP 通知。
  3. 调用代理对象阶段
    通过反射依次执行 AOP 通知和目标方法。

三、Bean 生命周期

  1. 实例化 Bean(为 Bean 分配内存空间)
    先通过 beanDefinition 拿到合适的构造方法
    • 默认情况下,取得是无参构造
    • 如果有 @Autowired 修饰的构造方法,就取该构造方法
  2. 属性注入(Bean 注入和装配)
    如果该 Bean 的创建依赖于其它 Bean 的存在,则会递归的去初始化其它 Bean
  3. Bean 初始化
    • 实现了各种 Aware 接口下的通知方法,如 BeanNameAware、BeanFactoryAware、
    • ApplicationContextAware 的接口方法;
    • 执行 BeanPostProcessor 初始化前置方法;
    • 执行 @PostConstruct 初始化方法,依赖注入操作之后被执行;
    • 执行自己指定的 init-method 方法(如果有指定的话);
    • 执行 BeanPostProcessor 初始化后置方法。
  4. 使用 Bean
    User user = context.getBean(User.class);
  5. 销毁 Bean
    销毁容器的各种方法,如 @PreDestroy、DisposableBean 接口方法、destroy-method。

四、Spring 事务

事务隔离又分为 4 种不同的级别,包括: 读未提交、读已提交、可重复读、可串行化。

需要注意:事务能否生效,取决于数据库引擎是否支持事务,MySQL 的 InnoDB 引擎是支持事务的,但 MyISAM 就不支持。

Spring中使用事务,我们要做的是:

  1. 对要使用事务的类或者方法,添加注解@Transactional。支持事务元数据设置,比如传播特性,回滚设置等,通过AOP将设置生效。
  2. 增加配置:@EnableTransactionManagement,来开启 Spring 中注解驱动的事务管理能力。SpringBoot 中默认开启,不需要加该注解。
  3. 一般是在 Service 层添加事务,然后其他层或者其他 Service 类来调用该事务类。

默认的事务能力是:

  • 传播机制是 REQUIRED,即当前无事务时新建一个事务,当前存在事务,则加入该事务中。
  • 隔离级别是 DEFAULT,即使用数据库默认的隔离级别,那么数据库层默认的隔离级别是REPEATABLE_READ (可重复读)。
  • transaction is read-write。服务于传播机制,相对应的 read-only 来表明只做只读操作。
  • 默认超时时间,跟随底层事务服务提供方,如果不支持超时逻辑则没有。我们使用的默认超时时间是50s。
  • 回滚机制适用于 RuntimeException。checked Exception不会触发。

参考文章:Spring的事务详解


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一只咸鱼。。

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

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

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

打赏作者

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

抵扣说明:

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

余额充值