跳至主要內容
BeanFactory和FactoryBean

关系

他们的区别比较容易理解,从字面意思就能区分开发,BeanFactory是Bean工厂,而FactroyBean是工厂Bean

BeanFactory,Spring中工厂的顶层规范,他是IOC容器的核心接口,它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。它定义了getBean()、containsBean()等管理Bean的通用方法。

Spring 容器中有两种Bean:普通Bean和工厂Bean。Spring直接使用前者,FactoryBean跟普通Bean不同,其返回的对象不是指定类的一个实例,而是该FactoryBean的getObject方法所返回的对象。


Znyoung大约 4 分钟JavaSpring
Autowired和Resource的区别

相同点

对于下面的代码来说,如果是Spring容器的话,两个注解的功能基本是等价的,他们都可以将bean注入到对应的field中

@Autowired
private Bean beanA;
@Resource
private Bean beanB;

Znyoung大约 2 分钟JavaSpring
Spring事务的传播机制

Spring事务的传播机制有哪些?

Spring的事务传播机制用于控制在多个事务方法相互调用时事务的行为。

在复杂的业务场景中,多个事务方法之间的调用可能会导致事务的不一致,如出现数据丢失、重复提交等问题,使用事务传播机制可以避免这些问题的发生,保证事务的一致性和完整性

Spring的事务规定了7种事务的传播级别,默认的传播机制是REQUIRED

  1. required,如果不存在事务则开启一个事务,如果存在事务则加入之前的事务,总是只有一个事务在执行
  2. required_new,每次执行新开一个事务
  3. supported,有事务则加入事务,没有事务则普通执行
  4. supported_not,有事务则暂停该事务,没有则普通执行
  5. mandatory,强制有事务,没有事务则报异常
  6. never,有事务则报异常
  7. nested,如果之前有事务,则创建嵌套事务,嵌套事务回滚不影响父事务,反之父事务影响嵌套事务

Znyoung大约 2 分钟JavaSpring
Spring的注入方式

Spring支持哪些注入方式

字段注入

@Autowired
private Bean bean;

Znyoung大约 7 分钟JavaSpring
SpringBean的初始化流程

初始化流程

当我们启动Spring容器后,会先通过AbstractApplicationContext#refresh方法,调用BeanFactoryPostProcess方法,可以在bean初始化前,修改context中的BeanDefinition,但是因为此时Bean还没有初始化,所以并不会修改bean实例。然后会开始初始化非懒加载的bean。

  1. 通过InstantiationAwareBeanPostProcessor在实例化bean之前做前置处理,这样做的目的是可以给应用代码一个返回代理bean的机会(Spring AOP在这里实现
  2. 通过反射实例化该bean(有多种情况,分为有参数,无参数构造器,以及是否有Autowired注解)
  3. 填充Bean的field实例(此时可能会有循环依赖问题,涉及到循环初始化)
  4. 调用初始化方法之前,先调用BeanPostProcessor#postProcessBeforeInitialization方法(各种Aware的织入就在此处执行)
  5. 执行该bean的初始化方法,如InitializingBean#afterProperties方法,或者自定义的init-method方法
  6. 调用BeanPostProcessor#postProcessAfterInitialization执行初始化的后置处理方法
  7. 如果该bean有相关的销毁方法,则将对应的销毁方法注册进容器中,当销毁bean的时候会进行回调处理

Znyoung大约 1 分钟JavaSpring
Spring的AOP

介绍Spring的AOP

AOP(Aspect-Oriented Programming),即面向切面编程,用人话说就是把公共的逻辑抽出来,让开发者可以更专注于业务逻辑开发。

和IOC一样,AOP也指的是一种思想。AOP思想是OOP面向对象(Object-Oriented Programming)的补充。OOP是面向类和对象的,但是AOP则是面向不同切面的。一个切面可以横跨多个类和对象去操作,极大的丰富了开发者的使用方式,提高了开发效率。

常见概念

名词概念 解释
切面(Aspect) 切面是一个模块化的特性,它包含了一组通知和切点。通知定义了在切点处要执行的代码,而切点则定义了在何处应用通知。切面可以被应用到一个或多个目标对象中。
通知(Advice) 通知定义了切面在切点处执行的代码。在Spring AOP中,有五种类型的通知:前置通知(Before)、后置通知(After)、返回通知(After-returning)、异常通知(After-throwing)和环绕通知(Around)。
切点(Pointcut) 切点定义了在哪些连接点上应用通知。连接点是在应用执行过程中能够插入切面的点,如方法调用或异常处理。切点使用表达式来匹配连接点。
连接点(Joinpoint) 连接点是在应用执行过程中能够插入切面的点,如方法调用或异常处理。连接点是切点的实际实例。
引入(Introduction) 引入允许向现有的类添加新的接口和实现。在Spring AOP中,引入是通过一个特殊的通知类型实现的。
织入(Weaving) 织入是将切面应用到目标对象并创建新的代理对象的过程。在编译时、加载时或运行时进行织入。
目标对象(Target Object) 目标对象是被一个或多个切面所通知的对象。也被称为被通知对象。
代理对象(Proxy Object) 代理对象是在目标对象基础上创建的对象,它将切面织入到目标对象中。当客户端通过代理对象调用目标对象时,切面的通知将被触发。
Advisor Advisor是将切点和通知组合在一起的对象。它是AOP的基本组成单元。
切面自动代理(Aspect Auto Proxy) 切面自动代理是Spring容器自动为目标对象创建代理对象并将切面织入到代理对象中的过程。
AOP代理(AOP Proxy) AOP代理是将切面织入到目标对象中的代理对象。在Spring AOP中,有两种类型的AOP代理:JDK动态代理和CGLIB代理。

Znyoung大约 3 分钟JavaSpring
Spring的IOC

Spring IOC的介绍

IOC(inversion of control),就是控制反转的意思。何为控制反转?我们可以根据字面意思理解,就是对于某个东西A,原来的控制权在使用方B,B想用就能用,不想用就不用。现在把控制权交还给了A,只有A给了才能用,这样就是控制反转了。

  • 无IOC
class A {}
class B {

    // B需要将A的实例new出来,也就是我们说的控制
    private A a = new A();

    public void use() {
        System.out.print(a);
    }
        
}

Znyoung大约 2 分钟JavaSpring