spring中Constructor、@Autowired、@PostConstruct的顺序

本文详细解析了Spring框架中依赖注入的执行顺序,即构造器注入(Constructor)、自动装配(@Autowired)与初始化方法(@PostConstruct)的具体执行时机及应用场景。通过实例说明,深入理解Spring依赖注入机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

spring中Constructor、@Autowired、@PostConstruct的顺序 - u014515854的博客 - 优快云博客
https://blog.youkuaiyun.com/u014515854/article/details/78832790

 

      其实从依赖注入的字面意思就可以知道,要将对象p注入到对象a,那么首先就必须得生成对象p与对象a,才能执行注入。所以,如果一个类A中有个成员变量p被@Autowired注解,那么@Autowired注入是发生在A的构造方法执行完之后的。

如果想在生成对象时候完成某些初始化操作,而偏偏这些初始化操作又依赖于依赖注入,那么就无法在构造函数中实现。为此,可以使用@PostConstruct注解一个方法来完成初始化,@PostConstruct注解的方法将会在依赖注入完成后被自动调用。

Constructor >> @Autowired >> @PostConstruct

举个例子:


public Class AAA {

@Autowired

private BBB b;


public AAA() {

System.out.println("此时b还未被注入: b = " + b);

}


@PostConstruct

private void initFunction() {

System.out.println("@PostConstruct将在依赖注入完成后被自动调用: b = " + b);

}

 

Spring 容器中,`@Autowired` 和 `@PostConstruct` 注解的执行顺序是固定的,并且遵循依赖注入和初始化阶段的规范流程。 当一个 Bean 被创建时,Spring 会先完成构造方法的调用,然后进行依赖注入。也就是说,`@Autowired` 注解所标注的字段、方法或构造函数会在 Bean 的构造方法执行完毕之后被处理[^1]。这意味着如果某个类中存在通过 `@Autowired` 注入的依赖,这些依赖将在构造函数执行完成之后被注入到该 Bean 中。 随后,在所有依赖注入完成之后,Spring执行使用 `@PostConstruct` 注解的方法。这个注解通常用于标记那些需要在依赖注入完成后执行的初始化逻辑。例如,可以用来建立数据库连接、加载缓存数据等操作。因此,`@PostConstruct` 方法是在依赖注入完成之后才被调用的[^2]。 以下是一个简单的代码示例,展示了这两个注解的执行顺序: ```java @Component public class ExampleBean { private Dependency dependency; @Autowired public void setDependency(Dependency dependency) { this.dependency = dependency; System.out.println("Dependency injected"); } @PostConstruct public void init() { System.out.println("Initialization logic here"); } public ExampleBean() { System.out.println("Constructor executed"); } } ``` 在这个例子中,输出顺序将是: 1. 构造函数输出“Constructor executed”。 2. 依赖注入方法输出“Dependency injected”。 3. 初始化方法输出“Initialization logic here”。 需要注意的是,`@PostConstruct` 是 JSR-250 标准的一部分,它并不局限于 Spring 框架,但 Spring 支持这一标准。此外,为了确保这些注解能够正常工作,必须启用注解驱动的配置,这通常是通过 `<context:annotation-config/>` 或者 `@AnnotationConfigApplicationContext` 来实现的[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值