Spring基础知识
本文最后更新于 2023-12-09,文章内容可能已经过时。
Spring基础知识:
做八股和日常使用查缺补漏之用.
1.bean的生命周期:
2.1 生命周期:
在Spring框架中,Bean的生命周期包括以下阶段:
实例化(Instantiation):
当容器启动时,Spring会根据配置信息实例化Bean。这通常是通过构造函数来创建Bean的实例。
属性设置(Populate Properties):
容器在实例化Bean之后,将依赖注入到Bean的属性中。这是通过调用setter方法或者直接设置属性值实现的。
初始化(Initialization):
在Bean的全部属性都被设置之后,Spring容器会调用Bean的初始化方法。这可以通过在Bean类中定义
init
方法,或者通过在配置文件中使用init-method
属性来指定。
BeanPostProcessor的后置处理(BeanPostProcessor.postProcessAfterInitialization):
如果容器中注册了
BeanPostProcessor
接口的实现类,它们将在Bean初始化之后执行一些额外的操作。
使用(In Use):
Bean可以在应用程序中被使用了,它执行业务逻辑。
销毁(Destruction):
当容器关闭时,或者通过销毁方法(通过
destroy-method
属性指定)显式地销毁Bean。销毁方法会在Bean被销毁之前调用。
属性赋值:
时间点: 属性赋值是在对象创建时(通过构造函数或工厂方法)对对象的属性进行赋值的过程。
实现方式: 属性赋值可以通过构造函数参数、setter方法、或者直接设置字段的方式进行。
目的: 主要用于将对象的属性初始化为指定的值,以满足对象在创建后的一些基本要求。
例子:
javaCopy codepublic class MyClass { private String name; // 通过构造函数参数进行属性赋值 public MyClass(String name) { this.name = name; } // 通过setter方法进行属性赋值 public void setName(String name) { this.name = name; } }
初始化:
时间点: 初始化是在对象创建完成后、属性赋值之后,但在对象真正被使用之前的阶段进行的操作。
实现方式: 可以通过实现
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的初始化阶段得以执行。
具体步骤如下:
Spring容器实例化Bean。
如果该Bean有与之关联的切面(通过AOP配置关联),则在实例化后,Spring会为该Bean创建一个代理对象。
客户端通过代理对象调用目标Bean的方法。
代理对象在调用目标方法之前或之后,执行相关的切面逻辑。
总之,AOP的织入在Bean的初始化之后,但在客户端调用Bean的方法之前或之后发生。这确保了切面逻辑在Bean生命周期的适当阶段得以执行。