如何在SpringBoot中创建非可复用Bean
如何让SpringBoot为每次注入生成新的Bean实例
核心思路:修改Bean作用域
SpringBoot默认Bean是singleton(单例),所有注入点共享同一个实例。针对你的RestTemplateBuilder这种有状态Bean,要避免修改带来的副作用,只需把它的作用域改成prototype——这个作用域的Bean,每次被注入或获取时都会生成新实例。
实现方式1:直接给@Bean加@Scope注解
在声明RestTemplateBuilder的@Bean方法上添加@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE):
import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Scope; import org.springframework.web.client.RestTemplateBuilder; @Bean @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public RestTemplateBuilder restTemplateBuilder() { return new RestTemplateBuilder(); }
这样每处@Autowired RestTemplateBuilder都会拿到全新的实例,修改某个实例的配置不会影响其他使用方。
实现方式2:结合@Lazy优化(可选)
如果RestTemplateBuilder的创建开销较大,可以搭配@Lazy注解,让实例在真正被使用时才创建,避免不必要的资源消耗:
@Bean @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) @Lazy public RestTemplateBuilder restTemplateBuilder() { return new RestTemplateBuilder(); }
特殊场景处理:单例Bean中使用Prototype Bean
如果是在单例Bean里注入Prototype Bean,默认只会在单例Bean初始化时注入一次实例。要是想每次调用都拿到新的RestTemplateBuilder,可以用ObjectFactory或者Provider来动态获取:
import org.springframework.beans.factory.ObjectFactory; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplateBuilder; @Component public class MyService { private final ObjectFactory<RestTemplateBuilder> builderFactory; // 构造注入ObjectFactory public MyService(ObjectFactory<RestTemplateBuilder> builderFactory) { this.builderFactory = builderFactory; } public void executeRequest() { // 每次调用getObject()都会生成新实例 RestTemplateBuilder builder = builderFactory.getObject(); RestTemplate restTemplate = builder.build(); // 执行请求逻辑... } }
注意点
- Prototype作用域的Bean,Spring只负责创建实例,不会管理它的销毁生命周期(比如不会触发
@PreDestroy注解方法),如果需要清理资源,要自己处理。
内容的提问来源于stack exchange,提问作者Rafael Lima
相关产品推荐
相关产品推荐

