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
相关产品推荐
相关产品推荐

