ObjectProvider可以解决循环依赖

ObjectProvider是Spring框架中的一个重要工具,用于延迟获取Bean实例,解决循环依赖和原型作用域下的依赖注入问题。通过示例展示了如何在循环依赖和原型Bean中使用ObjectProvider来管理依赖关系。
摘要由CSDN通过智能技术生成

ObjectProvider

在Spring框架中,ObjectProvider类是一个用于获取Bean实例的接口,它提供了一种延迟获取Bean实例的方式。ObjectProvider类可以用于解决循环依赖、解决原型作用域下的依赖注入问题以及延迟加载Bean等场景。

ObjectProvider类提供了以下主要功能:

1.延迟获取Bean实例:ObjectProvider可以延迟获取Bean实例,只有在需要时才会真正创建Bean实例,可以避免提前实例化Bean。

2.解决循环依赖:ObjectProvider可以在循环依赖的场景下提供解决方案,通过延迟获取Bean实例来避免循环依赖导致的问题。

3.解决原型作用域下的依赖注入问题:当Bean的作用域为原型(prototype)时,通过ObjectProvider可以每次获取一个新的Bean实例,而不是单例。

4.提供依赖查找功能:ObjectProvider可以根据Bean的类型或名称进行依赖查找,获取所需的Bean实例。

//在需要解决循环依赖的Bean中,将对另一个Bean的依赖注入改为ObjectProvider类型的注入。
@Component
public class BeanA {
    private final ObjectProvider<BeanB> beanBProvider;

    @Autowired
    public BeanA(ObjectProvider<BeanB> beanBProvider) {
        this.beanBProvider = beanBProvider;
    }

    public void doSomething() {
        BeanB beanB = beanBProvider.getIfAvailable();
        // 使用BeanB实例进行操作
    }
}
//在另一个Bean的依赖注入处,使用@Lazy注解延迟加载Bean实例。
@Component
@Lazy
public class BeanB {
    private final BeanA beanA;

    @Autowired
    public BeanB(BeanA beanA) {
        this.beanA = beanA;
    }
}

ObjectProvider用法

关于ObjectProvider用法,看了一篇博客,感觉写的不错,记录一下
https://www.cnblogs.com/fengxueyi/p/13888562.html

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
package com.xiangyixiang.www.cloud.business.gateway.configure; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.http.HttpMessageConverters; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.reactive.CorsWebFilter; import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource; import org.springframework.web.util.pattern.PathPatternParser; import java.util.stream.Collectors; /**网关统一配置允许跨域 * zj 解决跨域问题 * @author 张静 */ @Configuration public class CorsConfig { @Bean public CorsWebFilter corsFilter() { CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); config.addAllowedMethod("*"); config.addAllowedOrigin("http://39.105.36.172:9250"); config.addAllowedHeader("*"); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser()); source.registerCorsConfiguration("/**", config); return new CorsWebFilter(source); } @Bean @ConditionalOnMissingBean public HttpMessageConverters messageConverters(ObjectProvider<HttpMessageConverter<?>> converters) { return new HttpMessageConverters(converters.orderedStream().collect(Collectors.toList())); } }
06-10

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值