gpt4 book ai didi

spring - CommandLineRunner 和 Bean (Spring)

转载 作者:行者123 更新时间:2023-12-02 03:46:35 29 4
gpt4 key购买 nike

对我的问题进行编码:

   @SpringBootApplication
public class Application {

private static final Logger log = LoggerFactory.getLogger(Application.class);

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

@Bean
public Object test(RestTemplate restTemplate) {
Quote quote = restTemplate.getForObject(
"http://gturnquist-quoters.cfapps.io/api/random", Quote.class);
log.info(quote.toString());
return new Random();
}

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

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

我对 Spring 很陌生。据我了解,@Bean 注释负责将对象保存在 IoC 容器中,对吗?

如果是这样:是否首先收集所有带有 @Bean 的方法,然后然后执行?

在我的示例中,我添加了一个方法 test() ,其作用与 run() 相同,但返回一个对象(Random())。结果是相同的,因此它可以与 CommandLineRunner 和 Object 一起使用。

它是否有理由返回 CommandLineRunner,即使用像 run() 这样的语法?

此外:到目前为止,我还没有看到将方法移至容器的优势。为什么不直接执行呢?

谢谢!

最佳答案

@Configuration类( @SpringBootApplication extends @Configuration )是注册 spring bean 的地方。 @Bean用于声明 spring bean。用 @Bean 注解的方法必须返回一个对象(bean)。默认情况下,spring bean 是单例的,因此一旦该方法用 @Bean 注释被执行并返回它的值,该对象一直存在到应用程序结束。

就你的情况

    @Bean
public Object test(RestTemplate restTemplate) {
Quote quote = restTemplate.getForObject(
"http://gturnquist-quoters.cfapps.io/api/random", Quote.class);
log.info(quote.toString());
return new Random();
}

这将生成名为“test”的 Random 类型的单例 bean。因此,如果您尝试在其他 spring bean 中注入(inject)(例如使用 @Autowire )该类型或名称的 bean,您将获得该值。所以这不是一个很好的使用 @Bean注释,除非您正是想要这样。

CommandLineRunner另一方面是一个特殊的 bean,它允许您在加载并启动应用程序上下文后执行一些逻辑。所以这里使用restTemplate,调用url并打印返回值是有意义的。

不久前,注册 Spring bean 的唯一方法是使用 xml。所以我们有一个 xml 文件和 bean 声明,如下所示:

<bean id="myBean" class="org.company.MyClass">
<property name="someField" value="1"/>
</bean>

@Configuration类相当于 xml 文件和 @Bean方法相当于 <bean> xml 元素。

因此,最好避免在 bean 方法中执行逻辑,而坚持创建对象并设置其属性。

关于spring - CommandLineRunner 和 Bean (Spring),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43416227/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com