Spring源码前置概念

本文深入探讨Spring框架中的BeanDefinition,BeanFactory,ApplicationContext以及FactoryBean等核心概念。BeanDefinition作为Bean的元数据,包含作用域、懒加载、依赖等属性。BeanFactory是生产Bean的容器,ApplicationContext提供了更强大的功能,包括环境信息获取、资源加载等。FactoryBean用于自定义Bean创建方式。此外,文章还介绍了BeanFactoryPostProcessor和BeanPostProcessor,它们分别用于BeanDefinition的后置处理和Bean的增强处理。
摘要由CSDN通过智能技术生成

BeanDefinition

在这里插入图片描述

beanDefinition表示Bean定义,是spring用来生产实例Bean的元数据,如@Component,@Bean,标签等都会解析成bean定义供后续spring容器去生产bean实例。有以下几个主要的属性。

  1. scope:表示bean的作用域,如单例beansingleton(默认),多例prototype,request每次请求重新实例化,Session每个会话对内是单例的
  2. lazyInit:是否需要懒加载,懒加载在第一次使用bean时才会被实例化,非懒加载在spring启动时便实例化
  3. dependsOn:表示这个bean在实例化前需要依赖的其他bean,也就是说需要保证dependsOn数组中的bean先实例化
  4. primain:表示这个bean是否是主bean,当依赖注入发现多个同类型的bean时,会选择这个primain为true的bean

BeanFactory

在这里插入图片描述

BeanFactory是一种spring容器,用来生产bean对象,它有许多实现类,下面介绍一个最重要的实现类DefaultListableBeanFactory
在这里插入图片描述

查看它的俩个父类发现父类的方法名称都和Definition,Bean等相关,如registerBeanDefiniton():拥有了注册bean定义的能力,getBeanDefinitionNames():拥有了获取所有bean定义的名称的能力等等,直接推断出这个DefaultListableBeanFactory绝对是用来生产bean的一个容器。

ApplicationContext

在这里插入图片描述
ApplicationContext也是bean容器,但他比beanFactory要强大许多,从它的类图可以看到它继承了多个beanFactory,自然的继承了相应的功能,简单来说就是通过继承实现一个功能更加强大的容器。

  1. EnvironmentCapable:可获取操作系统,环境变量,JVM环境信息等
  2. MessageSource:获取某些国际化资源
  3. ApplicationEventPublisher:发布事件功能
  4. ResourcePatternResolver:加载获取图片,文件等资源的能力

FactoryBean

在这里插入图片描述

初学者容易和BeanFactory混淆,它是spring提供的一种灵活的创建Bean的方式,继承FacoryBean,实现getObject方法,返回的对象就会被注入到容器中,当然,这个实现类本身得是一个Bean。下面向容器注册一个实现类FB,那么容器中beanName为”FB“的就是一个Object类(重写的getObject方法返回的是一个Object),而实现得本身的beanName则是加一个&符号,即”&FB“,原理是spring处理这个实现类bean时发现它实现了FactoryBean接口,会去做特殊处理。

package com.foo;

import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;

@Component("FB")
public class FB implements FactoryBean {
	@Override
	public Object getObject() throws Exception {
		return new Object();
	}

	@Override
	public Class<?> getObjectType() {
		return null;
	}
}

BeanFactoryPostProcessor

在这里插入图片描述
它叫beanDefinition后置处理器,它是围绕beandefinition进行增强的,他只有一个方法void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory),形参里是一个beanFactory对象,前面提到beanFactory是容器,可以去生产bean,如它可以通过getBeanDefinition(String)去拿到某个beanDefinition,这样我们就可以随心所欲的去修改beanDefiniton的属性,比如直接把class对象替换成一个Object类,这个beandefinition后续生产的bean便会变成Object类型。也就是说可以利用这个beanDefinition后置处理器去对beanDefinition做一些自定义操作。

BeanDefinitionRegistryPostProcessor

BeanDefinitionRegistryPostProcessor继承了BeanFactoryPostProcessor,基于注解的spring启动流程中非常核心的一个概念-解析配置类就是这一块处理。主要的调用流程如图,后续会详细介绍具体流程
在这里插入图片描述
之所以说这里和解析配置类相关,就是因为有一个叫做ConfigurationClassPostProcessor的类实现了BeanDefinitionRegistryPostProcessor并重写了postProcessBeanDefinitionRegistry方法,解析配置类,将所有的beandefinition注册进来,后续生产bean
在这里插入图片描述

BeanPostProcessor

这个就是Bean的后置处理器了,那就是去给bean进行增强的,在源码中主要有9处增强,具体用途如图所示,具体流程后续分析源码
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值