深度解析 Spring 源码:揭秘 AbstractAutowireCapableBeanFactory 的 Bean 生命周期处理

本文主要是介绍深度解析 Spring 源码:揭秘 AbstractAutowireCapableBeanFactory 的 Bean 生命周期处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

文章目录

    • 一、AbstractAutowireCapableBeanFactory 概述
      • 1.1 详细分析
      • 1.2 设计思想
    • 二、深入解析AbstractAutowireCapableBeanFactory 的实现细节
      • 2.1 Bean 实例化过程分析
        • 2.1.1 createBean()
        • 2.1.2 createBeanInstance()
      • 2.2 Bean 属性注入的实现机制
        • 2.2.1 populateBean()
        • 2.2.2 applyBeanPropertyValues()
      • 2.3 初始化方法的调用过程
        • 2.3.1 initializeBean()
        • 2.3.2 invokeAwareMethods()
        • 2.3.4 applyBeanPostProcessorsBeforeInitialization()
        • 2.3.5 invokeInitMethods()
        • 2.3.6 applyBeanPostProcessorsAfterInitialization()
      • 2.4 销毁机制的实现
        • 2.4.1 destroyBean()
        • 2.4.2 destroy()
    • 三、实例分析与应用场景
      • 3.1 如何利用 AbstractAutowireCapableBeanFactory 扩展 Bean 的功能
      • 3.2 在项目中如何充分利用 Bean 生命周期处理机制

一、AbstractAutowireCapableBeanFactory 概述

AbstractAutowireCapableBeanFactory是Spring框架中的一个重要类,主要负责实现Bean的自动装配功能。

1.1 详细分析

  1. BeanFactory和AutowireCapableBeanFactory: 在Spring中,BeanFactory是IoC容器的基础接口,负责管理bean的生命周期和依赖注入。AutowireCapableBeanFactoryBeanFactory的子接口,扩展了自动装配功能,可以根据配置自动解析和注入bean的依赖关系。
  2. AbstractAutowireCapableBeanFactory的作用AbstractAutowireCapableBeanFactoryAutowireCapableBeanFactory接口的抽象实现类。它提供了一系列用于自动装配和创建bean的模板方法,包括:
    • 解析bean的依赖关系,根据需要进行自动装配。
    • 执行属性填充,将依赖注入到bean中。
    • 初始化bean,包括调用初始化方法和应用BeanPostProcessors(后置处理器)等。
  3. 关键方法和功能AbstractAutowireCapableBeanFactory中的关键方法包括:
    • createBean(Class beanClass):根据给定的类创建一个新的bean实例。
    • applyBeanPropertyValues(Object existingBean, String beanName):应用属性值到现有的bean实例。
    • initializeBean(Object existingBean, String beanName):初始化bean实例,包括执行初始化方法和应用后置处理器等。
  4. 自动装配:该类实现了自动装配功能,根据bean的依赖关系和配置,自动解析和注入所需的依赖。自动装配可以通过构造函数、设值方法或字段进行。

1.2 设计思想

  1. IoC和 DI: Spring 框架的核心思想之一是 IoC 和 DI。IoC 意味着将控制权交给框架,由框架负责管理对象的生命周期和依赖关系。DI 则是 IoC 的一种具体实现方式,通过依赖注入的方式,将对象的依赖关系从代码中解耦,使得代码更加灵活和可维护。AbstractAutowireCapableBeanFactory 实现了这一设计思想,通过自动装配的方式,实现了对象之间的依赖注入。
  2. 面向接口编程: Spring 框架鼓励面向接口编程,而不是面向实现编程。AbstractAutowireCapableBeanFactory 提供了一系列接口,如 BeanFactory、AutowireCapableBeanFactory 等,通过面向接口编程的方式,提高了代码的可扩展性和灵活性。
  3. 模板方法模式: AbstractAutowireCapableBeanFactory 使用了模板方法模式,定义了一组抽象方法和基本方法,子类可以根据具体需求来实现这些抽象方法,从而实现不同的自动装配策略。
  4. 单一职责原则: 设计思想中的单一职责原则要求一个类应该只有一个引起它变化的原因。AbstractAutowireCapableBeanFactory 的设计遵循了这一原则,它专注于实现 Bean 的自动装配功能,而将其他功能如 Bean 的创建、初始化等交给了父类 AbstractBeanFactory 来实现,从而使得类的职责更加清晰和单一。

二、深入解析AbstractAutowireCapableBeanFactory 的实现细节

本文主要详解Bean生命周期的核心实现方法,过程有些缺少,想要了解的Bean生命周期全过程的读者,可以查看我上一篇文章。

2.1 Bean 实例化过程分析

2.1.1 createBean()

根据提供的类信息和配置创建一个新的 Bean 实例,并将其作用域设置为原型模式。

在这里插入图片描述

主要负责 Bean 实例的创建过程,包括解析类信息、准备方法覆盖、实例化前的处理以及实际的 Bean 创建过程。

在这里插入图片描述

2.1.2 createBeanInstance()

主要负责创建 Bean 实例,体现Spring在实例化Bean时考虑的各种情况,包括是否需要自动装配,构造方法是否已经解析,以及如何选择合适的构造方法来创建Bean实例

在这里插入图片描述

2.2 Bean 属性注入的实现机制

2.2.1 populateBean()

主要负责填充Bean属性的populateBean方法,负责处理Bean的属性值,包括自动装配和依赖检查。

在这里插入图片描述

在这里插入图片描述

2.2.2 applyBeanPropertyValues()

主要用于将Bean定义中的属性值应用到已存在的Bean实例上的方法。

在这里插入图片描述

2.3 初始化方法的调用过程

2.3.1 initializeBean()

负责初始化Bean,调用Bean生命周期中的回调方法,包括Aware接口方法和自定义的初始化方法。

在这里插入图片描述

2.3.2 invokeAwareMethods()

确保了实现了Aware接口的Bean,可以在其生命周期中获得对Spring容器的相关信息的访问。

在这里插入图片描述

2.3.4 applyBeanPostProcessorsBeforeInitialization()

确保了在Bean初始化之前,所有的Bean后处理器都有机会对Bean进行自定义操作。

在这里插入图片描述

2.3.5 invokeInitMethods()

确保了Bean在初始化过程中可以执行自定义的逻辑,包括实现InitializingBean接口的Bean的afterPropertiesSet方法和Bean定义中指定的自定义初始化方法。

在这里插入图片描述

2.3.6 applyBeanPostProcessorsAfterInitialization()

确保了在Bean初始化之后,所有的Bean后处理器都有机会对Bean进行自定义操作。

在这里插入图片描述

2.4 销毁机制的实现

2.4.1 destroyBean()

确保了Bean在销毁过程中可以执行自定义的逻辑,包括实现DisposableBean接口的Bean的destroy方法和Bean定义中指定的自定义销毁方法。

在这里插入图片描述

2.4.2 destroy()

负责调用实现了DisposableBean接口的Bean的destroy方法,以及Bean定义中指定的自定义销毁方法。

在这里插入图片描述

在这里插入图片描述

三、实例分析与应用场景

3.1 如何利用 AbstractAutowireCapableBeanFactory 扩展 Bean 的功能

要利用AbstractAutowireCapableBeanFactory扩展Bean的功能,可以通过编写自定义的BeanPostProcessorBeanFactoryPostProcessor来实现。这两个接口允许在Spring容器实例化和配置Bean的不同阶段介入并添加自定义逻辑。例如,可以在Bean初始化前后执行额外的操作,或者在Bean实例化前修改Bean的定义。

使用BeanPostProcessor来扩展Bean功能的Demo:

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;/** * CustomBeanPostProcessor实现了BeanPostProcessor接口,并覆盖了postProcessBeforeInitialization和postProcessAfterInitialization方法* 这两个方法分别在Bean初始化之前和之后执行* 可以在这些方法中添加自定义的逻辑,以扩展Bean的功能*/
@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {/*** 日常开发中:可以执行额外的初始化操作,例如初始化某些属性、连接到外部资源或设置日志记录器等*/@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {// 在Bean初始化之前执行操作if (bean instanceof CustomBean) {((CustomBean) bean).beforeInit(); // 假设CustomBean有一个beforeInit方法}return bean;}/*** 日常开发中:可以执行额外的销毁操作,例如释放资源、关闭连接或记录统计信息等*/@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {// 在Bean初始化之后执行操作if (bean instanceof CustomBean) {((CustomBean) bean).afterInit(); // 假设CustomBean有一个afterInit方法}return bean;}
}

使用BeanFactoryPostProcessor扩展Bean功能的Demo

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;/*** CustomBeanFactoryPostProcessor实现了BeanFactoryPostProcessor接口* 在postProcessBeanFactory方法中注册了一个名为"customBean"的新Bean*/
@Component
public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {/*** 日常开发中:修改Bean定义等*/@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {// 在这里可以访问和修改Bean的定义// 如:添加一个新的Bean定义beanFactory.registerSingleton("customBean", new CustomBean());}
}

3.2 在项目中如何充分利用 Bean 生命周期处理机制

案例:有一个简单的Spring Boot项目,其中包含一个名为UserService的服务类,以及一个名为CustomBean的自定义Bean类。将通过自定义初始化和销毁逻辑、AOP、事件监听器和与外部资源的连接来展示如何充分利用Bean生命周期处理机制。

CustomBean自定义Bean类:

import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;/*** 演示自定义初始化和销毁逻辑*/
@Component
public class CustomBean {@PostConstructpublic void init() {System.out.println("CustomBean initialized");// 添加自定义的初始化逻辑...}@PreDestroypublic void destroy() {System.out.println("CustomBean destroyed");// 添加自定义的销毁逻辑...}
}

CustomBeanPostProcessor类:

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;/*** 实现BeanPostProcessor接口,以便在Bean的初始化和销毁阶段添加自定义逻辑*/
@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof CustomBean) {((CustomBean) bean).init();}return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof CustomBean) {((CustomBean) bean).destroy();}return bean;}
}

CustomAspect切面类:

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;@Aspect
@Component
public class CustomAspect {@After("execution(* com.example.UserService.*(..))")public void afterUserServiceMethods() {System.out.println("AOP: After UserService methods");// 添加横切关注点...}
}

CustomApplicationListener类:

import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;/*** 实现ApplicationListener接口,以便监听Bean生命周期事件*/
@Component
public class CustomApplicationListener implements ApplicationListener<ContextRefreshedEvent> {@Overridepublic void onApplicationEvent(ContextRefreshedEvent event) {System.out.println("ApplicationListener: Context refreshed");// 监听器逻辑...}
}

UserService中使用外部资源(例如数据库连接)

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;@Service
public class UserService {@Autowiredprivate DataSource dataSource;@PostConstructpublic void init() {System.out.println("UserService initialized");// 连接到外部资源...}public void createUser(String username) {System.out.println("Creating user: " + username);// 业务逻辑...}public void deleteUser(String username) {System.out.println("Deleting user: " + username);// 业务逻辑...}@PreDestroypublic void destroy() {System.out.println("UserService destroyed");// 释放外部资源...}
}

山的那边有我的期许,你有看见吗

这篇关于深度解析 Spring 源码:揭秘 AbstractAutowireCapableBeanFactory 的 Bean 生命周期处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/970998

相关文章

java设计模式之工厂模式--普通工厂方法模式(Factory Method)

1.普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。 2.先定义一个接口: package com.zhong.pattern.factorymethod;/*** 发送接口* @author admin**/public interface Sender {/*** 发送消息方法* @param msg*/void send(String msg);} 3

Java设计模式之代理模式2-动态代理(jdk实现)

这篇是接着上一篇继续介绍java设计模式之代理模式。下面讲解的是jdk实现动态代理。 1.)首先我们要声明一个动态代理类,实现InvocationHandler接口 package com.zhong.pattern.proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;/*** 演

java设计模式之代理模式1--静态代理

Java编程的目标是实现现实不能完成的,优化现实能够完成的,是一种虚拟技术。生活中的方方面面都可以虚拟到代码中。代理模式所讲的就是现实生活中的这么一个概念:助手。 代理模式的定义:给某一个对象提供一个代理,并由代理对象控制对原对象的引用。 1.)首先新建一个表演的接口 package com.zhong.pattern.proxy;/*** 表演接口* @author admin*

java原型(Prototype)设计模式

原型模式就是讲一个对象作为原型,使用clone()方法来创建新的实例。 public class Prototype implements Cloneable{private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}@Overri

Java中23种设计模式之适配者模式

适配器模式的作用就是在原来的类上提供新功能。 主要可分为3种: 1.类适配:创建新类,继承源类,并实现新接口,例如:     class Adapter extends OldClass implements NewFunc{} 2.对象适配:创建新类持源类的实例,并实现新接口,例如:     class Adapter implements NewFunc { priva

java不依赖临时变量交换两个变量的值

java不依赖临时变量交换两个变量的值 1.简单易懂的实现方式     int a=1,b=2;     int temp = 0;     temp = a;     a = b;     b= temp; 2.算术算法 int a=1,b=2; a = a+b;// a = 1+2  b = a-b;// b = a-b --> b=3-2 -->1 a = a -b;/

Java中的SOLID原则及示例

类是任何Java应用程序的构建块。如果这些区块不强,那么建筑(即应用)将来将面临艰难时期。这实际上意味着,当应用程序范围上升或应用程序在生产或维护中面临某些设计问题时,不那么好的编写会导致非常困难的情况。 另一方面,一组精心设计和编写的类可以加速编码过程的突飞猛进,同时减少错误的数量。 在本教程中,我们将使用 5个最推荐的设计原则的示例来讨论Java中的SOLID原则,在编写类时我们应该记住这

Java比较和交换示例 - CAS算法

Java比较和交换示例 - CAS算法 由Lokesh Gupta | 提起下:多线程 一个Java 5中最好添加的是支持类,如原子操作AtomicInteger,AtomicLong等等。这些课程帮助您最大限度地减少复杂的(非必要)需要多线程的,如增加一些基本的操作代码或递减的值在多个线程之间共享。这些类内部依赖于名为CAS(比较和交换)的算法。在本文中,我将详细讨论这个概念。 1.乐观和

java并发编程之CyclicBarrier(循环栅栏)

package com.zhong;import java.util.concurrent.CyclicBarrier;/*** Cyclic意思是循环,Barrier意思是屏障,那么CyclicBarrier翻译过来就是循环栅栏。* 它是一个同步辅助类,能让一组线程互相等待,* 直到这一组线程都到了一个公共屏障点,各线程才能继续向下执行。因为该屏障能够在释放等待线程后继续重用,所以叫循环屏障。*

Java内存管理 - 垃圾收集算法

我们都知道Java 中垃圾收集器 [GC] 的功能。但只有少数人试图深入了解垃圾收集的工作原理。你不是其中之一,这就是你在这里的原因。 在这个Java内存管理教程中,我们将尝试了解Java垃圾收集的当前算法,我们将了解这些算法的演变。 目录1. Java中的内存管理2.引用计数机制3.标记和清除机制4.停止并复制GC 5.分代停止和复制6.如何提高Java中的内存利用率 1.