Bean的前身今世&处理器&Aware

简介: 出生: ......幼年:BeanDefinition  bean的接口定义小学:GenericBeanDefinition  基础的bean映射中学:RootBeanDefinition  拥有依赖关系等附加信息等bean大学:BeanWrapper  内部用社会:Object 你的bean BeanDefinitionBeanDefinition是一个接口,在Spring中存在三种实现:RootBeanDefinition、ChildBeanDefinition以及GenericBeanDefinition。

出生: <bean>......</bean>

幼年:BeanDefinition  bean的接口定义

小学:GenericBeanDefinition  基础的bean映射

中学:RootBeanDefinition  拥有依赖关系等附加信息等bean

大学:BeanWrapper  内部用

社会:Object 你的bean

 

BeanDefinition

BeanDefinition是一个接口,在Spring中存在三种实现:RootBeanDefinition、ChildBeanDefinition以及GenericBeanDefinition。三种实现均继承了AbstractBeanDefinition,其中BeanDefinition是配置文件元素标签在容器中的内部表示形式。元素标签拥有class、scope、lazy-init等配置属性,BeanDefinition则提供了相应的beanClass、scope、lazyInit属性,BeanDefinition和中的属性是一一对应的。其中RootBeanDefinition是最常用的实现类,它对应一般性的元素标签,GenericBeanDefinition是自2.5版本以后新加入的bean文件配置属性定义类,是一站式服务类。

在配置文件中可以定义父和子,父用RootBeanDefinition表示子用ChildBeanDefiniton表示而没有父的就使用RootBeanDefinition表示。AbstractBeanDefinition对两者共同的类信息进行抽象。

Spring通过BeanDefinition将配置文件中的配置信息转换为容器的内部表示,并将这些BeanDefiniton注册到BeanDefinitonRegistry中。Spring容器的BeanDefinitionRegistry就像是Spring配置信息的内存数据库,主要是以map的形式保存,后续操作直接从BeanDefinitionRegistry中读取配置信息。

 

Bean的生命周期 

IoC容器之中,这个bean的生命周期就会交由容器进行管理,一般担当管理者角色的是BeanFactory或ApplicationContext。(默认是BeanFactory的生命周期)

标红的二选一

Bean的建立

  由BeanFactory读取Bean定义文件,并生成各个BeanDefinition。

BeanFactoryPostProcessor的postProcessBeanFactory

  容器每一次刷新时(初始化)调用,它是对BeanDefinition进行后处理,具体的作用就是可以修改配置文件的各个bean的配置。

InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation

  所有bean对象实例化之前执行,具体点就是执行每个bean类构造函数之前。 Give BeanPostProcessors a chance to return a proxy instead of the target bean instance。返回一个Object,实际上返回一个null即可。如果不为null就不再执行下面bean的实例化,直接返回此时的object。

Bean实例化,调用bean类构造函数

InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation

  bean类实例化之后,初始化之前调用。返回类型是boolean,默认是false,你需要更改为true,否则无法注入属性

InstantiationAwareBeanPostProcessor的postProcessPropertyValue

  属性注入之前调用。返回类型是PropertyValue,默认返回null,这里需改为返回第一个参数。

Setter注入

  执行Bean的属性依赖注入。
BeanNameAware的setBeanName()

  属性注入后调用,该方法作用是让bean类知道自己所在的Bean的name或id属性。 

BeanFactoryAware的setBeanFactory()

  setBeanName后调用,该方法作用是让bean类知道自己所在的BeanFactory的属性(传入bean所在BeanFactory类型参数)。 

BeanPostProcessor的postProcessBeforeInitialization()

  对bean实例化、初始化做些预处理操作。返回类型为Object,默认返回null,需要返回参数中bean。

InstantiationAwareBeanPostProcessor(本身继承了BeanPostProcessors)的postProcessBeforeInitialization

  再次执行,参考上面的描述

InitializingBean的afterPropertiesSet()

  bean类实现InitializingBean接口,重写该方法。初始化工作,但实现该接口这种方法和Spring耦合,不推荐(这一点DisposableBean一样)。

Bean定义文件中定义init-method

  执行initMethod()方法,注意,这个方法是不带参数的。

BeanPostProcessor的postProcessAfterInitialization()

  Bean在初始化之后做些修改。返回类型为Object,默认返回null,需要返回参数中bean。

InstantiationAwareBeanPostProcessor的postProcessAfterInitialization

  再次执行,参考上面的描述  

程序执行,bean工作

DisposableBean的destroy()

  bean销毁前执行。

Bean定义文件中定义destroy-method

  执行destroyMethod()方法,注意,这个方法是不带参数的。

 

Spring的aware

spring框架提供了多个*Aware接口,用于辅助Spring Bean编程访问Spring容器。

通过实现这些接口,可以增强Spring Bean的功能,但是也会造成对Spring框架的绑定。
ApplicationContextAware,ApplicationContext
LoadTimeWeaverAware,加载Spring Bean时织入第三方模块,如AspectJ
BeanClassLoaderAware,加载Spring Bean的类加载器
BootstrapContextAware,资源适配器BootstrapContext,如JCA,CCI
ResourceLoaderAware,底层访问资源的加载器
BeanFactoryAware,声明BeanFactory
PortletConfigAware,PortletConfig
PortletContextAware,PortletContext
ServletConfigAware,ServletConfig
ServletContextAware,ServletContext
MessageSourceAware,国际化
ApplicationEventPublisherAware,应用事件
NotificationPublisherAware,JMX通知
BeanNameAware,声明Spring Bean的名字

 

 

  

 

目录
相关文章
|
4天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
280 116
|
19天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
6天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
397 38
Meta SAM3开源:让图像分割,听懂你的话
|
13天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
669 220
|
1天前
|
Windows
dll错误修复 ,可指定下载dll,regsvr32等
dll错误修复 ,可指定下载dll,regsvr32等
131 95
|
11天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1654 158
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
909 61