本文最后更新于 2023-12-09,文章内容可能已经过时。

Spring基础知识:

做八股和日常使用查缺补漏之用.

1.bean的生命周期:

2.1 生命周期:

在Spring框架中,Bean的生命周期包括以下阶段:

  1. 实例化(Instantiation):

    • 当容器启动时,Spring会根据配置信息实例化Bean。这通常是通过构造函数来创建Bean的实例。

  2. 属性设置(Populate Properties):

    • 容器在实例化Bean之后,将依赖注入到Bean的属性中。这是通过调用setter方法或者直接设置属性值实现的。

  3. 初始化(Initialization):

    • 在Bean的全部属性都被设置之后,Spring容器会调用Bean的初始化方法。这可以通过在Bean类中定义init方法,或者通过在配置文件中使用init-method属性来指定。

  4. BeanPostProcessor的后置处理(BeanPostProcessor.postProcessAfterInitialization):

    • 如果容器中注册了BeanPostProcessor接口的实现类,它们将在Bean初始化之后执行一些额外的操作。

  5. 使用(In Use):

    • Bean可以在应用程序中被使用了,它执行业务逻辑。

  6. 销毁(Destruction):

    • 当容器关闭时,或者通过销毁方法(通过destroy-method属性指定)显式地销毁Bean。销毁方法会在Bean被销毁之前调用。

  1. 属性赋值:

  • 时间点: 属性赋值是在对象创建时(通过构造函数或工厂方法)对对象的属性进行赋值的过程。

  • 实现方式: 属性赋值可以通过构造函数参数、setter方法、或者直接设置字段的方式进行。

  • 目的: 主要用于将对象的属性初始化为指定的值,以满足对象在创建后的一些基本要求。

  • 例子:

    javaCopy codepublic class MyClass {
        private String name;
    ​
        // 通过构造函数参数进行属性赋值
        public MyClass(String name) {
            this.name = name;
        }
    ​
        // 通过setter方法进行属性赋值
        public void setName(String name) {
            this.name = name;
        }
    }
  1. 初始化:

  • 时间点: 初始化是在对象创建完成后、属性赋值之后,但在对象真正被使用之前的阶段进行的操作。

  • 实现方式: 可以通过实现InitializingBean接口的afterPropertiesSet方法、使用@PostConstruct注解、配置XML中的init-method属性等方式进行初始化操作。

  • 目的: 主要用于执行一些需要在对象准备好之后进行的初始化逻辑,例如建立数据库连接、加载资源、启动线程等。

  • 例子:

    javaCopy codeimport org.springframework.beans.factory.InitializingBean;
    ​
    public class MyBean implements InitializingBean {
        private String name;
    ​
        public void afterPropertiesSet() throws Exception {
            // 在属性赋值后进行初始化操作
            System.out.println("Object initialized: " + name);
        }
    }

总体而言,属性赋值是对象创建阶段的一部分,主要是为了给对象的属性赋予初值。而初始化是在对象赋值完成之后,为了执行一些额外的初始化逻辑,确保对象在被使用之前处于一个正确的状态。在Spring框架中,可以通过InitializingBean接口、@PostConstruct注解等方式来实现初始化逻辑。

2. aop作用时机:

是的,AOP通常在Spring Bean的初始化阶段起作用。在Spring的生命周期中,AOP的织入(weaving)通常发生在Bean的初始化完成之后,即在初始化方法调用之后。

具体来说,AOP在Spring中通过代理机制实现,它通过为目标Bean创建一个代理对象,将切面逻辑织入到目标方法的调用中。这个代理对象可以是JDK动态代理或者CGLIB动态代理。

在运行期间,当客户端调用目标Bean的方法时,代理对象会拦截方法调用并执行相关的切面逻辑。这种方式确保了切面逻辑在Bean的初始化阶段得以执行。

具体步骤如下:

  1. Spring容器实例化Bean。

  2. 如果该Bean有与之关联的切面(通过AOP配置关联),则在实例化后,Spring会为该Bean创建一个代理对象。

  3. 客户端通过代理对象调用目标Bean的方法。

  4. 代理对象在调用目标方法之前或之后,执行相关的切面逻辑。

总之,AOP的织入在Bean的初始化之后,但在客户端调用Bean的方法之前或之后发生。这确保了切面逻辑在Bean生命周期的适当阶段得以执行。