拥抱工作 發表於 2025-7-8 21:49:00

Spring Bean 的生命周期

<p><span data-cke-copybin-start="1">​</span>Spring Bean 的生命周期是指从 Bean 被&nbsp;<strong>创建、初始化、使用到销毁&nbsp;</strong>的完整过程,这一过程由 Spring 容器严格管理。</p>
<p><strong>1、实例化(Instantiation)</strong></p>
<ul>
<li>通过反射、工厂方法等方式创建 Bean 实例。</li>
</ul>
<p><strong>2、依赖注入(Dependency Injection)</strong></p>
<ul>
<li>为 Bean 的字段或方法<strong>注入</strong>依赖对象,如通过<code>@Autowired</code>、<code>@Value</code>等注解,或通过XML配置注入。
<pre class="language-java highlighter-hljs"><code>@Component
public class UserService {
    @Autowired
    private UserRepository userRepository; // 依赖注入阶段会赋值
}</code></pre>
</li>
</ul>
<p><strong>3、初始化前处理(PostProcessBeforeInitialization)</strong></p>
<ul>
<li>允许自定义 Bean 初始化前的修改。</li>
<li>BeanPostProcessor#postProcessBeforeInitialization:所有 Bean 都会经过此接口处理。</li>
<li>典型实现:ApplicationContextAwareProcessor(处理Aware接口,如ApplicationContextAware)。</li>
</ul>
<p><strong>4、初始化(Initialization)</strong></p>
<ul>
<li>执行 Bean 的初始化逻辑。</li>
<li>实现 <strong>InitializingBean </strong>接口,使用 <strong>@PostConstruct</strong> 注解,都可以进行初始化。
<pre class="language-java highlighter-hljs"><code>public class DataSource implements InitializingBean {
    @Override
    public void afterPropertiesSet() {
      // 初始化数据库连接
    }
}</code></pre>
<pre class="language-java highlighter-hljs"><code>@Component
public class CacheService {
    @PostConstruct
    public void initCache() {
      // 加载缓存数据
    }
}</code></pre>
</li>
</ul>
<p><strong>5、初始化后处理(PostProcessAfterInitialization)</strong></p>
<ul>
<li>允许自定义 Bean 初始化后的修改(如代理生成)。</li>
<li>BeanPostProcessor#postProcessAfterInitialization:典型应用是 <strong>AOP 代理</strong>创建(如AnnotationAwareAspectJAutoProxyCreator)。</li>
</ul>
<p><strong>6、Bean 可用(Ready for Use)</strong></p>
<ul>
<li>Bean 已完全初始化,可被应用程序获取并使用。</li>
</ul>
<p><strong>7、销毁前处理(PostProcessBeforeDestruction)</strong></p>
<ul>
<li>容器关闭时执行 Bean 的销毁前逻辑。</li>
<li>在<code>ConfigurableApplicationContext#close()</code>或<code>DisposableBeanAdapter#destroy()</code>时触发。</li>
</ul>
<p><strong>8、销毁(Destruction)</strong></p>
<ul>
<li>实现 <strong>DisposableBean</strong> 接口,使用 <strong>@PreDestroy</strong> 注解,都可以对 Bean 进行销毁。
<pre class="language-java highlighter-hljs"><code>public class DatabaseConnection implements DisposableBean {
    @Override
    public void destroy() {
      // 关闭数据库连接
    }
}</code></pre>
<pre class="language-java highlighter-hljs"><code>@Component
public class ResourceService {
    @PreDestroy
    public void releaseResources() {
      // 释放系统资源
    }
}</code></pre>
</li>
</ul>
<p>Spring Bean 的生命周期,通过 <strong>"实例化→注入→初始化→销毁"&nbsp;</strong>的阶段划分,结合接口与注解的扩展点,允许我们在各个环节介入自定义一些逻辑,从而能实现一些我们想要的效果。</p>
<p style="text-align: right"><span style="color: rgba(53, 152, 219, 1)">命是弱者的借口,运是强者的谦辞。-- 烟沙九洲</span></p><br><br>
来源:https://www.cnblogs.com/yanshajiuzhou/p/18973918
頁: [1]
查看完整版本: Spring Bean 的生命周期