spring更加松散的获取bean的方式ObjectProvider

概述

ObjectProvider直译就是对象提供者;

平时从spring中获取bean都是调用beanFactory.getBean()方法,如果bean不存在则会直接抛异常;

spring 4.3开始引入了org.springframework.beans.factory.ObjectProvider接口,其提供了若干的方法,可以更松散的获取bean.

BeanFactory中也有定义返回值是ObjectProvider的相关方法;

ObjectProvider方法解释

直接引用一波网上现成的翻译

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

	// 返回指定类型的bean, 如果容器中不存在, 抛出NoSuchBeanDefinitionException异常
    // 如果容器中有多个此类型的bean, 抛出NoUniqueBeanDefinitionException异常
	T getObject(Object... args) throws BeansException;

	// 如果指定类型的bean注册到容器中, 返回 bean 实例, 否则返回 null
	@Nullable
	T getIfAvailable() throws BeansException;

	// 如果返回对象不存在,则进行回调,回调对象由Supplier传入
	default T getIfAvailable(Supplier<T> defaultSupplier) throws BeansException {
		T dependency = getIfAvailable();
		return (dependency != null ? dependency : defaultSupplier.get());
	}

	 // 消费对象的一个实例(可能是共享的或独立的),如果存在通过Consumer回调消耗目标对象。
	default void ifAvailable(Consumer<T> dependencyConsumer) throws BeansException {
		T dependency = getIfAvailable();
		if (dependency != null) {
			dependencyConsumer.accept(dependency);
		}
	}

	// 如果不可用或不唯一(没有指定primary)则返回null。否则,返回对象。
	@Nullable
	T getIfUnique() throws BeansException;

	// 如果存在唯一对象,则调用Supplier的回调函数
	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);
		}
	}

	// 返回符合条件的对象的Iterator,没有特殊顺序保证(一般为注册顺序)
	@Override
	default Iterator<T> iterator() {
		return stream().iterator();
	}

	// 返回符合条件对象的连续的Stream,没有特殊顺序保证(一般为注册顺序)
	default Stream<T> stream() {
		throw new UnsupportedOperationException("Multi element access not supported");
	}

	// 返回符合条件对象的连续的Stream。在标注Spring应用上下文中采用@Order注解或实现Order接口的顺序
	default Stream<T> orderedStream() {
		throw new UnsupportedOperationException("Ordered element access not supported");
	}
}

参考文章
https://www.cnblogs.com/secbro/p/11974729.html

你可能感兴趣的:(spring,spring,java,后端)