ObjectProvider学习

简介

ObjectProvider 是 Spring Framework 5.0 之后引入的一个新接口,它提供了一个灵活的方式来访问由 Spring 容器管理的 Bean。ObjectProvider 提供了一种更加类型安全的方式来查找和注入依赖项,同时还支持 Null 值的处理以及延迟初始化。
ObjectProvider 的一个主要优点是它支持延迟初始化。通过 getIfAvailableLazy() 方法,你可以获取一个懒加载的 Iterable,这意味着只有在迭代时才会触发 Bean 的初始化。
在 Spring 的配置和编程模型中,ObjectProvider 可以用于更灵活地处理依赖注入,特别是在处理可选的、延迟初始化的或条件性的依赖时。

源码

public interface ObjectProvider<T> extends ObjectFactory<T>, Iterable<T> {

	/**
	 * 获取bean
	 */
	T getObject(Object... args) throws BeansException;

	/**
	 * 如果容器中有一个可用的 Bean,则返回它,否则返回 null
	 */
	@Nullable
	T getIfAvailable() throws BeansException;

	/**
	 * 同上
	 */
	default T getIfAvailable(Supplier<T> defaultSupplier) throws BeansException {
		T dependency = getIfAvailable();
		return (dependency != null ? dependency : defaultSupplier.get());
	}

	/**
	 * 判断容器中是否存在一个可用的bean
	 */
	default void ifAvailable(Consumer<T> dependencyConsumer) throws BeansException {
		T dependency = getIfAvailable();
		if (dependency != null) {
			dependencyConsumer.accept(dependency);
		}
	}

	/**
	 * 如果容器中只有一个匹配的 Bean,则返回它;如果有多个匹配的 Bean,则抛出异常。
	 */
	@Nullable
	T getIfUnique() throws BeansException;

	/**
	 * 同上
	 */
	default T getIfUnique(Supplier<T> defaultSupplier) throws BeansException {
		T dependency = getIfUnique();
		return (dependency != null ? dependency : defaultSupplier.get());
	}

	/**
	 *判断是否是唯一
	 */
	default void ifUnique(Consumer<T> dependencyConsumer) throws BeansException {
		T dependency = getIfUnique();
		if (dependency != null) {
			dependencyConsumer.accept(dependency);
		}
	}

	/**
	 * 获取迭代bean的迭代器
	 */
	@Override
	default Iterator<T> iterator() {
		return stream().iterator();
	}

	/**
	 *获取bean的流
	 */
	default Stream<T> stream() {
		throw new UnsupportedOperationException("Multi element access not supported");
	}

	/**
	 * 获取排序的流
	 */
	default Stream<T> orderedStream() {
		throw new UnsupportedOperationException("Ordered element access not supported");
	}

}

示例

import org.springframework.beans.factory.ObjectProvider;  
import org.springframework.stereotype.Component;  
  
@Component  
public class MyComponent {  
  
    private final ObjectProvider<OptionalDependency> optionalDependencyProvider;  
  
    public MyComponent(ObjectProvider<OptionalDependency> optionalDependencyProvider) {  
        this.optionalDependencyProvider = optionalDependencyProvider;  
    }  
  
    public void doSomething() {  
        OptionalDependency optionalDependency = optionalDependencyProvider.getIfAvailable();  
        if (optionalDependency != null) {  
            // 使用 optionalDependency  
        }  
    }  
}

在这个例子中,OptionalDependency 是一个可选的依赖项,MyComponent 通过 ObjectProvider 注入它,并使用 getIfAvailable() 方法在运行时检查它是否存在。如果 OptionalDependency Bean 在容器中可用,那么它将被注入并使用;否则,getIfAvailable() 将返回 null,并且 MyComponent 可以继续正常工作,而不需要这个依赖项。

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值