You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中@Bean注解方法的执行时机、顺序及参数注入疑问

你的代码示例

@SpringBootApplication
public class ConsumingRestApplication {
    private static final Logger log = LoggerFactory.getLogger(ConsumingRestApplication.class);

    public static void main(String[] args) {
        SpringApplication.run(ConsumingRestApplication.class, args);
    }

    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
        return builder.build();
    }

    @Bean
    public CommandLineRunner run(RestTemplate restTemplate) throws Exception {
        return args -> {
            Quote quote = restTemplate.getForObject(
                    "https://quoters.apps.pcfone.io/api/random", Quote.class);
            log.info(quote.toString());
        };
    }
}

关于@Bean方法的三个核心问题解答

1. @Bean标注的方法何时执行?

当你调用SpringApplication.run()启动Spring Boot应用时,Spring会启动IoC容器的初始化流程:

  • 首先扫描带有@SpringBootApplication的主类,识别其中标注@Bean的方法。
  • 这些方法会在容器完成Bean定义解析后、实例化Bean的阶段被调用,调用后返回的对象会被Spring纳入IoC容器管理,成为可被其他组件依赖的Bean实例。

简单来说:应用启动时,Spring会自动帮你调用这些@Bean方法,把生成的对象存进容器,不用你手动调用或从上下文获取。

2. @Bean方法的执行顺序?

Spring会根据Bean之间的依赖关系自动决定执行顺序:

  • 比如你的代码中,run()方法需要RestTemplate类型的参数,而RestTemplate是由restTemplate()方法生成的。
  • 所以Spring会先执行restTemplate()方法,把生成的RestTemplate实例存入容器,之后才会执行run()方法,确保它能拿到需要的依赖。

如果多个@Bean方法之间没有依赖关系,Spring默认会按它们在类中的定义顺序执行,但不建议依赖这个顺序,最好通过明确的依赖关系来控制。

3. @Bean方法的参数值是如何注入的?

这是Spring依赖注入的核心逻辑:
当@Bean方法带有参数时,Spring会自动从IoC容器中查找匹配类型的Bean实例,并注入到方法参数中:

  • 比如restTemplate(RestTemplateBuilder builder):RestTemplateBuilder是Spring Boot自动配置提供的Bean,容器中已经存在这个实例,所以Spring会直接把它传给builder参数。
  • 再比如run(RestTemplate restTemplate):容器里已经有了restTemplate()方法生成的RestTemplate实例,Spring会把这个实例注入到restTemplate参数中。

如果存在多个同类型的Bean,还可以通过@Qualifier注解指定Bean名称来匹配,但你的示例中每个类型的Bean都是唯一的,所以直接按类型匹配注入即可。

内容的提问来源于stack exchange,提问作者Yoo oo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 14:39:14