@PostConstruct 是 JSR-250 标准注解,用于 Bean 依赖注入完成后、提供服务前执行初始化逻辑,要求方法无参、非静态、返回 void,且仅对单例 Bean 有效。

在 Spring 中,@PostConstruct 是一个标准的 JSR-250 注解,用于标记 Bean 初始化完成后、正式提供服务前需要执行的方法。它比构造函数晚、比 @Autowired 依赖注入完成之后执行,适合做资源加载、连接初始化、缓存预热等操作。
使用前提:确保注解生效
Spring 默认支持 @PostConstruct,但需满足以下条件:
- Bean 必须由 Spring 容器管理(即通过
@Component、@Service等声明,或 XML/JavaConfig 注册) - 项目中需引入
jakarta.annotation-api(新版本,如 Jakarta EE 9+)或javax.annotation-api(旧版 Java EE),Spring 6+ 已迁移到 Jakarta 命名空间 - 方法不能有参数、不能是 static、返回类型必须为 void
基本写法示例
下面是一个典型用法:
<font color="#888"><pre class="brush:php;toolbar:false;">@Service
public class DataService {
@Autowired
private DataSource dataSource;
private Connection connection;
@PostConstruct
public void init() {
try {
this.connection = dataSource.getConnection();
System.out.println("数据库连接已初始化");
} catch (SQLException e) {
throw new RuntimeException("初始化连接失败", e);
}
}
// 后续业务方法可安全使用 connection
}
注意:init() 方法会在 dataSource 注入完成后自动调用,此时所有 @Autowired 字段已就绪。
与其它初始化方式的对比
常见初始化方式还有 InitializingBean.afterPropertiesSet() 和 @Bean(initMethod = "..."),它们的执行顺序一致(都晚于依赖注入),但推荐优先用 @PostConstruct:
- 它是 Java 标准注解,不耦合 Spring,迁移或测试更灵活
- 比
InitializingBean更轻量,无需实现接口 - 比
@Bean(initMethod)更直观,直接写在类内部,语义清晰
注意事项和避坑点
实际使用中容易忽略以下细节:
-
不能在静态方法上使用 ——
@PostConstruct只能修饰实例方法 - 异常会中断容器启动 —— 方法抛出未捕获异常会导致 Bean 创建失败,应用无法启动
- 不适用于原型(prototype)Bean 的每次创建 —— 它只在每次 Bean 实例化后执行一次,对 prototype Bean 每次 getBean 都会触发
- 避免在其中调用其他 Bean 的非幂等方法 —— 如重复注册监听器、开启多个定时任务等
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











