我想知道在创建bean时,如何在spring引导中注入一些构造器。
例如,在spring引导自动配置中,JacksonAutoConfiguration文件
@Bean
@Scope("prototype")
@ConditionalOnMissingBean
Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder(ApplicationContext applicationContext,
List<Jackson2ObjectMapperBuilderCustomizer> customizers) {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder.applicationContext(applicationContext);
customize(builder, customizers);
return builder;
}列表
发布于 2022-11-11 15:05:56
bean定义中的参数并不总是在其他地方定义的“其他bean”,而是可以简单地称为“自由”参数。在这种情况下,bean定义只是一个方法:使用所需的参数调用它,它将返回结果。
因为这个“免费”参数是事先不知道的,所以您必须告诉Spring:
它不能将bean实例化为默认的"singleton",它使用"prototype"
BeanFactory.getBean(Class cl, Object... arguments)在您所展示的代码中,spring-boot在某个地方会有这样的调用。
beanFactory.getBean(Jackson2ObjectMapperBuilder.class, applicationContext, cusomizerList)为了能够侦听Jackson2ObjectMapperBuilder bean,它将注意到:
特定的application)
通过这种方式,您可以获得一个bean,该bean可以使用仅在运行时可用的参数构建。在本例中,这在“配置”运行时非常有用,但它是在您自己的应用程序中构建“智能bean”的一种非常强大的方法。
“春天的邪恶部分”注记
Spring的默认行为是构建'singleton‘,也就是@Service bean。多线程应用程序中的单例bean需要没有字段才是线程安全的。
这给一个完全的“过程”设计带来了失败,它通常会破坏正确的面向对象方法的所有优点(这种方法需要字段来管理内部状态,当然还需要提供更高的抽象级别)。
https://stackoverflow.com/questions/72751072
复制相似问题