Spring是我们经常使用的一个框架,它功能之一是提供了我们管理bean对象的手段,而且它提供了很多钩子方法给我们使用。什么是钩子方法呢?钩子方法就是:在bean的生命周期之中,经历了一系列的过程之中,Spring留给我们的一个后门,让我们能在Spring的生命周期之中执行我们想要的方法,从而实现我们想要的功能。接下来我们介绍一下生命周期,然后一个一个介绍我见过的样例或者我自己写的样例。
Spring生命周期的各种Aware
Spring的生命周期(我们撇开网络上很多资料,因为我觉得网络上很多资料要么不全,要么分不清context和beanFactory,然后将context的一些过程归入beanFactory之中。我这里只看Spring官方文档,我看的是5.3.0-SNAPSHOT版本的。)

上面列表说的114个初始化方法,13个销毁方法。这就是我说的钩子方法,只要你进程并实现了对应的方法,spring就会帮我们调用这些方法。
然后针对上面的bean lifecycle 我这里用一个简单的例子给大家演示一下:
<span style="color:#000000"><code class="language-java"><span style="color:#6679cc">public</span> <span style="color:#6679cc">class</span> BeanLifecycle <span style="color:#6679cc">implements</span> BeanNameAware<span style="color:#999999">,</span> BeanClassLoaderAware<span style="color:#999999">,</span> BeanFactoryAware<span style="color:#999999">,</span> EnvironmentAware<span style="color:#999999">,</span>
EmbeddedValueResolverAware<span style="color:#999999">,</span> ResourceLoaderAware<span style="color:#999999">,</span> ApplicationEventPublisherAware<span style="color:#999999">,</span> MessageSourceAware<span style="color:#999999">,</span>
ApplicationContextAware<span style="color:#999999">,</span> ServletContextAware<span style="color:#999999">,</span> BeanPostProcessor<span style="color:#999999">,</span> InitializingBean<span style="color:#999999">,</span> DestructionAwareBeanPostProcessor<span style="color:#999999">,</span>
DisposableBean<span style="color:#999999">{</span>
<span style="color:#6b7394">/**
* BeanNameAware 的 setBeanName,这个是第一个触发
*/</span>
<span style="color:#999999">@Override</span>
<span style="color:#6679cc">public</span> <span style="color:#6679cc">void</span> <span style="color:#3d8fd1">setBeanName</span><span style="color:#999999">(</span>String s<span style="color:#999999">)</span> <span style="color:#999999">{</span>
System<span style="color:#999999">.</span>out<span style="color:#999999">.</span><span style="color:#3d8fd1">println</span><span style="color:#999999">(</span><span style="color:#ac9739">"第一个执行 bean name = "</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
<span style="color:#999999">}</span>
<span style="color:#6b7394">/**
* BeanClassLoaderAware 的 setBeanClassLoader
*/</span>
<span style="color:#999999">@Override</span>
<span style="color:#6679cc">public</span> <span style="color:#6679cc">void</span> <span style="color:#3d8fd1">setBeanClassLoader</span><span style="color:#999999">(</span>ClassLoader classLoader<span style="color:#999999">)</span> <span style="color:#999999">{</span>
System<span style="color:#999999">.</span>out<span style="color:#999999">.</span><span style="color:#3d8fd1">println</span><span style="color:#999999">(</span><span style="color:#ac9739">"第二个执行 classLoader = "</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
<span style="color:#999999">}</span>
<span style="color:#6b7394">/**
* BeanFactoryAware 的 setBeanFactory
*/</span>
<span style="color:#999999">@Override</span>
<span style="color:#6679cc">public</span> <span style="color:#6679cc">void</span> <span style="color:#3d8fd1">setBeanFactory</span><span style="color:#999999">(</span>BeanFactory beanFactory<span style="color:#999999">)</span> <span style="color:#6679cc">throws</span> BeansException <span style="color:#999999">{</span>
System<span style="color:#999999">.</span>out<span style="color:#999999">.</span><span style="color:#3d8fd1">println</span><span style="color:#999999">(</span><span style="color:#ac9739">"第三个执行 beanFactory = "</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
<span style="color:#999999">}</span>
<span style="color:#6b7394">/**
* EnvironmentAware 的 setEnvironment
*/</span>
<span style="color:#999999">@Override</span>
<span style="color:#6679cc">public</span> <span style="color:#6679cc">void</span> <span style="color:#3d8fd1">setEnvironment</span><span style="color:#999999">(</span>Environment environment<span style="color:#999999">)</span> <span style="color:#999999">{</span>
System<span style="color:#999999">.</span>out<span style="color:#999999">.</span><span style="color:#3d8fd1">println</span><span style="color:#999999">(</span><span style="color:#ac9739">"第四个执行 environment = "</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
<span style="color:#999999">}</span>
<span style="color:#6b7394">/**
* EmbeddedValueResolverAware 的 EmbeddedValueResolverAware
*/</span>
<span style="color:#999999">@Override</span>
<span style="color:#6679cc">public</span> <span style="color:#6679cc">void</span> <span style="color:#3d8fd1">setEmbeddedValueResolver</span><span style="color:#999999">(</span>StringValueResolver resolver<span style="color:#999999">)</span> <span style="color:#999999">{</span>
System<span style="color:#999999">.</span>out<span style="color:#999999">.</span><span style="color:#3d8fd1">println</span><span style="color:#999999">(</span><span style="color:#ac9739">"第五个执行 resolver = "</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
<span style="color:#999999">}</span>
<span style="color:#6b7394">/**
* ResourceLoaderAware 的 setResourceLoader
*/</span>
<span style="color:#999999">@Override</span>
<span style="color:#6679cc">public</span> <span style="color:#6679cc">void</span> <span style="color:#3d8fd1">setResourceLoader</span><span style="color:#999999">(</span>ResourceLoader resourceLoader<span style="color:#999999">)</span> <span style="color:#999999">{</span>
System<span style="color:#999999">.</span>out<span style="color:#999999">.</span><span style="color:#3d8fd1">println</span><span style="color:#999999">(</span><span style="color:#ac9739">"第六个执行 resourceLoader = "</span> <span style="color:#999999">)</span><span style="color:#999999">;</span>
<span style="color:#999999">}</span>
<span style="color:#6b7394">/**
* ApplicationEventPublisherAware 的 setApplicationEventPublisher
*/</span>
<span style="color:#99
Spring生命周期揭秘:利用Aware与BeanPostProcessor实现定制化

本文详细解析Spring框架中的生命周期钩子方法,如Aware接口和BeanPostProcessor的使用,通过实例展示如何在bean的生命周期中插入自定义逻辑。重点讨论Aware接口的触发顺序和BeanPostProcessor的执行时机,以及一个实际场景中的BeanPostProcessor应用。
最低0.47元/天 解锁文章
450

被折叠的 条评论
为什么被折叠?



