本文全面解析Spring Bean的生命周期,涵盖BeanFactory接口的所有相关生命周期接口及方法,完整呈现Bean的运行流程。
一、Spring Bean生命周期逻辑执行顺序 (从实例化到销毁)
(实例化到销毁)
-
加载Bean定义 (元数据处理)
- Spring从配置文件(@Configuration)、XML文件或组件扫描(@Component)读取Bean定义。
- 这是元数据处理步骤,尚未创建任何实例。
-
相关方法:
BeanDefinitionRegistry#registerBeanDefinition()
-
Bean实例化 (对象创建)
- 通过以下方式创建实际的Bean对象:
- 构造函数实例化
- 工厂方法
-
相关方法:
InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation()
- 通过以下方式创建实际的Bean对象:
-
设置Bean名称 (
BeanNameAware#setBeanName(String name)
)- 如果Bean实现了
BeanNameAware
,Spring会调用setBeanName()
方法来告知Bean其自身的名称。 - 这发生在依赖注入之前。
- 用例:如果Bean需要在应用程序上下文中知道其名称。
- 如果Bean实现了
public class MyBean implements BeanNameAware { @Override public void setBeanName(String name) { System.out.println("Bean Name Set: " + name); } }
-
设置Bean类加载器 (
BeanClassLoaderAware#setBeanClassLoader(ClassLoader classLoader)
)- 如果Bean需要访问其类加载器,Spring会调用此方法。
- 用例:如果Bean在运行时动态加载类。
public class MyBean implements BeanClassLoaderAware { @Override public void setBeanClassLoader(ClassLoader classLoader) { System.out.println("ClassLoader Set!"); } }
-
设置BeanFactory (
BeanFactoryAware#setBeanFactory(BeanFactory factory)
)- Spring将BeanFactory注入到Bean中。
- 用例:允许Bean以编程方式获取其他Bean。
public class MyBean implements BeanFactoryAware { @Override public void setBeanFactory(BeanFactory beanFactory) { System.out.println("BeanFactory Set!"); } }
-
设置环境 (
EnvironmentAware#setEnvironment(Environment environment)
)- 如果Bean需要访问环境变量和属性,则会调用此方法。
-
用例:用于动态访问
application.properties
中的值。
public class MyBean implements EnvironmentAware { @Override public void setEnvironment(Environment environment) { System.out.println("Environment Set!"); } }
-
设置嵌入式值解析器 (
EmbeddedValueResolverAware#setEmbeddedValueResolver(StringValueResolver resolver)
)- 允许Bean以编程方式解析占位符(${property})。
- 用例:当Bean需要手动解析占位符时很有用。
public class MyBean implements BeanNameAware { @Override public void setBeanName(String name) { System.out.println("Bean Name Set: " + name); } }
-
设置资源加载器 (
ResourceLoaderAware#setResourceLoader(ResourceLoader loader)
)- 仅适用于ApplicationContext,用于动态加载资源。
- 用例:加载文件、类路径资源或外部资源。
-
设置应用程序事件发布器 (
ApplicationEventPublisherAware#setApplicationEventPublisher(ApplicationEventPublisher publisher)
)- 如果Bean需要发布事件,则会调用此方法。
-
用例:用于广播事件,例如
ContextRefreshedEvent
。
-
设置消息源 (
MessageSourceAware#setMessageSource(MessageSource source)
)- 如果Bean需要国际化 (i18n) 支持,Spring 会注入 MessageSource。
-
设置ApplicationContext (
ApplicationContextAware#setApplicationContext(ApplicationContext ctx)
)- 如果Bean需要访问整个Spring ApplicationContext,则会调用此方法。
- 用例:允许动态访问其他Bean、环境设置等。
-
设置ServletContext (
ServletContextAware#setServletContext(ServletContext ctx)
)- 仅适用于Web应用程序,用于访问Web上下文信息。
-
初始化前的后处理 (
BeanPostProcessor#postProcessBeforeInitialization()
)- 允许在Bean初始化之前修改Bean。
-
自定义初始化
-
InitializingBean
的afterPropertiesSet()
- 自定义
@PostConstruct
方法 -
@Bean
中的自定义init-method
-
public class MyBean implements BeanClassLoaderAware { @Override public void setBeanClassLoader(ClassLoader classLoader) { System.out.println("ClassLoader Set!"); } }
-
初始化后的后处理 (
BeanPostProcessor#postProcessAfterInitialization()
)- 允许在Bean初始化之后修改Bean。
- 用例:用于创建代理、日志记录或面向方面编程 (AOP)。
-
Bean可供使用
- Bean已完全初始化并可用于应用程序。
二、销毁阶段 (Bean关闭生命周期)
当应用程序关闭时,Spring会优雅地销毁Bean。
-
销毁前的处理 (
DestructionAwareBeanPostProcessor#postProcessBeforeDestruction()
)- 允许在销毁之前进行清理。
-
DisposableBean
的destroy()
方法- 如果Bean实现了
DisposableBean
,则会调用destroy()
。
- 如果Bean实现了
public class MyBean implements BeanNameAware { @Override public void setBeanName(String name) { System.out.println("Bean Name Set: " + name); } }
-
自定义
@PreDestroy
方法 (首选方法)- 比
DisposableBean
更现代,在Bean销毁之前调用。
- 比
public class MyBean implements BeanClassLoaderAware { @Override public void setBeanClassLoader(ClassLoader classLoader) { System.out.println("ClassLoader Set!"); } }
-
自定义
destroy-method
(如果在@Bean
中定义)- 定义清理逻辑的替代方法。
三、完整流程总结 (最终顺序)
? Bean初始化阶段
- 加载Bean定义
- 实例化Bean (
new Bean()
) -
setBeanName()
(BeanNameAware
) -
setBeanClassLoader()
(BeanClassLoaderAware
) -
setBeanFactory()
(BeanFactoryAware
) -
setEnvironment()
(EnvironmentAware
) -
setEmbeddedValueResolver()
(EmbeddedValueResolverAware
) -
setResourceLoader()
(ResourceLoaderAware
) -
setApplicationEventPublisher()
(ApplicationEventPublisherAware
) -
setMessageSource()
(MessageSourceAware
) -
setApplicationContext()
(ApplicationContextAware
) -
setServletContext()
(ServletContextAware
) -
postProcessBeforeInitialization()
(BeanPostProcessor
) -
@PostConstruct
/afterPropertiesSet()
-
postProcessAfterInitialization()
(BeanPostProcessor
) - Bean可供使用
? Bean销毁阶段
-
postProcessBeforeDestruction()
(DestructionAwareBeanPostProcessor
) -
destroy()
(DisposableBean
) @PreDestroy
destroy-method
更多关于BeanFactory
接口及其方法的信息,请访问:https://www.php.cn/link/6759d0996526ddc8e27aa550f0b806b1
祝您编码愉快!?
以上是弹簧 - 春丝 - 剥离订单的详细内容。更多信息请关注PHP中文网其他相关文章!

javaispopularforcross-platformdesktopapplicationsduetoits“ writeonce,runanywhere”哲学。1)itusesbytbytybytecebytecodethatrunsonanyjvm-platform.2)librarieslikeslikeslikeswingingandjavafxhelpcreatenative-lookingenative-lookinguisis.3)

在Java中编写平台特定代码的原因包括访问特定操作系统功能、与特定硬件交互和优化性能。1)使用JNA或JNI访问Windows注册表;2)通过JNI与Linux特定硬件驱动程序交互;3)通过JNI使用Metal优化macOS上的游戏性能。尽管如此,编写平台特定代码会影响代码的可移植性、增加复杂性、可能带来性能开销和安全风险。

Java将通过云原生应用、多平台部署和跨语言互操作进一步提升平台独立性。1)云原生应用将使用GraalVM和Quarkus提升启动速度。2)Java将扩展到嵌入式设备、移动设备和量子计算机。3)通过GraalVM,Java将与Python、JavaScript等语言无缝集成,增强跨语言互操作性。

Java的强类型系统通过类型安全、统一的类型转换和多态性确保了平台独立性。1)类型安全在编译时进行类型检查,避免运行时错误;2)统一的类型转换规则在所有平台上一致;3)多态性和接口机制使代码在不同平台上行为一致。

JNI会破坏Java的平台独立性。1)JNI需要特定平台的本地库,2)本地代码需在目标平台编译和链接,3)不同版本的操作系统或JVM可能需要不同的本地库版本,4)本地代码可能引入安全漏洞或导致程序崩溃。

新兴技术对Java的平台独立性既有威胁也有增强。1)云计算和容器化技术如Docker增强了Java的平台独立性,但需要优化以适应不同云环境。2)WebAssembly通过GraalVM编译Java代码,扩展了其平台独立性,但需与其他语言竞争性能。

不同JVM实现都能提供平台独立性,但表现略有不同。1.OracleHotSpot和OpenJDKJVM在平台独立性上表现相似,但OpenJDK可能需额外配置。2.IBMJ9JVM在特定操作系统上表现优化。3.GraalVM支持多语言,需额外配置。4.AzulZingJVM需特定平台调整。

平台独立性通过在多种操作系统上运行同一套代码,降低开发成本和缩短开发时间。具体表现为:1.减少开发时间,只需维护一套代码;2.降低维护成本,统一测试流程;3.快速迭代和团队协作,简化部署过程。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

SublimeText3 Linux新版
SublimeText3 Linux最新版

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能