InitializingBean和init-method
时间: 2025-04-30 12:42:45 浏览: 38
### Spring 中 InitializingBean 接口与 `init-method` 属性的区别
#### 初始化机制概述
在 Spring 容器中,当 Bean 被实例化并完成属性填充之后,容器会尝试对其进行初始化配置。对于自定义的初始化逻辑,Spring 提供了两种主要的方式:实现 `InitializingBean` 接口或者使用 XML 或者 Java 配置中的 `init-method` 属性。
#### InitializingBean 接口详解
如果一个类实现了 `InitializingBean` 接口,则该类必须提供名为 `afterPropertiesSet()` 的无参方法,在这个方法里可以放置一些必要的初始化代码[^1]。这种方式的优点在于它是一个标准接口的一部分,因此可以在多个框架之间共享相同的约定;然而缺点也很明显——这使得应用程序依赖于特定的第三方库(即 Spring),从而降低了可移植性和灵活性[^3]。
```java
public class Cat implements InitializingBean {
private String name;
public void setName(String name){
this.name = name;
}
@Override
public void afterPropertiesSet(){
System.out.println("Cat's properties have been set.");
}
}
```
#### init-method 属性说明
相比之下,`init-method` 是一种更加灵活的选择。开发者可以通过此属性指定任意名称的方法作为初始化回调函数,而不必遵循固定的命名规则或继承某个特殊的接口。这意味着即使不引入额外的依赖项也能轻松集成到现有的项目结构当中去[^4]。
```xml
<bean id="car" class="com.example.Car" init-method="startEngine"/>
```
```java
public class Car{
private boolean engineStarted = false;
// Other fields and methods...
public void startEngine(){
engineStarted = true;
System.out.println("The car has started its engine.");
}
}
```
#### 执行顺序对比
无论是采用哪种方式来进行初始化操作,它们都会发生在所有的属性已经被赋值完毕之后,并且会在任何代理创建之前被执行。具体来说:
- 对于实现了 `InitializingBean` 接口的对象而言,其 `afterPropertiesSet()` 方法会被自动调用;
- 如果指定了 `init-method` 参数,则相应的用户定义方法也会被触发执行;
- 当两者同时存在时,先执行 `InitializingBean.afterPropertiesSet()` ,再执行由 `init-method` 指定的方法[^5]。
#### 默认初始化方法的支持
值得注意的是,为了简化配置过程,还可以利用 `<beans>` 标签下的 `default-init-method` 属性来一次性设定整个应用上下文中所有 Bean 的默认初始化行为,无需逐个声明每个 Bean 上的 `init-method` 属性。
```xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
...
default-init-method="initialize">
</beans>
```
阅读全文
相关推荐




















