ObjectProvider offers ifAvailable/ifUnique variants with Consumer
Issue: SPR-16001
This commit is contained in:
parent
9ff4c0bff8
commit
e927cae476
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2016 the original author or authors.
|
* Copyright 2002-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
package org.springframework.beans.factory;
|
package org.springframework.beans.factory;
|
||||||
|
|
||||||
|
import java.util.function.Consumer;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
import org.springframework.beans.BeansException;
|
import org.springframework.beans.BeansException;
|
||||||
|
|
@ -68,6 +69,22 @@ public interface ObjectProvider<T> extends ObjectFactory<T> {
|
||||||
return (dependency != null ? dependency : defaultSupplier.get());
|
return (dependency != null ? dependency : defaultSupplier.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Consume an instance (possibly shared or independent) of the object
|
||||||
|
* managed by this factory, if available.
|
||||||
|
* @param dependencyConsumer a callback for processing the target object
|
||||||
|
* if available (not called otherwise)
|
||||||
|
* @throws BeansException in case of creation errors
|
||||||
|
* @since 5.0
|
||||||
|
* @see #getIfAvailable()
|
||||||
|
*/
|
||||||
|
default void ifAvailable(Consumer<T> dependencyConsumer) throws BeansException {
|
||||||
|
T dependency = getIfAvailable();
|
||||||
|
if (dependency != null) {
|
||||||
|
dependencyConsumer.accept(dependency);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return an instance (possibly shared or independent) of the object
|
* Return an instance (possibly shared or independent) of the object
|
||||||
* managed by this factory.
|
* managed by this factory.
|
||||||
|
|
@ -96,4 +113,20 @@ public interface ObjectProvider<T> extends ObjectFactory<T> {
|
||||||
return (dependency != null ? dependency : defaultSupplier.get());
|
return (dependency != null ? dependency : defaultSupplier.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Consume an instance (possibly shared or independent) of the object
|
||||||
|
* managed by this factory, if unique.
|
||||||
|
* @param dependencyConsumer a callback for processing the target object
|
||||||
|
* if unique (not called otherwise)
|
||||||
|
* @throws BeansException in case of creation errors
|
||||||
|
* @since 5.0
|
||||||
|
* @see #getIfAvailable()
|
||||||
|
*/
|
||||||
|
default void ifUnique(Consumer<T> dependencyConsumer) throws BeansException {
|
||||||
|
T dependency = getIfUnique();
|
||||||
|
if (dependency != null) {
|
||||||
|
dependencyConsumer.accept(dependency);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1297,8 +1297,10 @@ public class AutowiredAnnotationBeanPostProcessorTests {
|
||||||
assertEquals(bf.getBean("testBean", "myName"), bean.getTestBean("myName"));
|
assertEquals(bf.getBean("testBean", "myName"), bean.getTestBean("myName"));
|
||||||
assertEquals(bf.getBean("testBean"), bean.getOptionalTestBean());
|
assertEquals(bf.getBean("testBean"), bean.getOptionalTestBean());
|
||||||
assertEquals(bf.getBean("testBean"), bean.getOptionalTestBeanWithDefault());
|
assertEquals(bf.getBean("testBean"), bean.getOptionalTestBeanWithDefault());
|
||||||
|
assertEquals(bf.getBean("testBean"), bean.consumeOptionalTestBean());
|
||||||
assertEquals(bf.getBean("testBean"), bean.getUniqueTestBean());
|
assertEquals(bf.getBean("testBean"), bean.getUniqueTestBean());
|
||||||
assertEquals(bf.getBean("testBean"), bean.getUniqueTestBeanWithDefault());
|
assertEquals(bf.getBean("testBean"), bean.getUniqueTestBeanWithDefault());
|
||||||
|
assertEquals(bf.getBean("testBean"), bean.consumeUniqueTestBean());
|
||||||
bf.destroySingletons();
|
bf.destroySingletons();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1315,8 +1317,10 @@ public class AutowiredAnnotationBeanPostProcessorTests {
|
||||||
assertSame(bf.getBean("testBean"), bean.getTestBean());
|
assertSame(bf.getBean("testBean"), bean.getTestBean());
|
||||||
assertSame(bf.getBean("testBean"), bean.getOptionalTestBean());
|
assertSame(bf.getBean("testBean"), bean.getOptionalTestBean());
|
||||||
assertSame(bf.getBean("testBean"), bean.getOptionalTestBeanWithDefault());
|
assertSame(bf.getBean("testBean"), bean.getOptionalTestBeanWithDefault());
|
||||||
|
assertEquals(bf.getBean("testBean"), bean.consumeOptionalTestBean());
|
||||||
assertSame(bf.getBean("testBean"), bean.getUniqueTestBean());
|
assertSame(bf.getBean("testBean"), bean.getUniqueTestBean());
|
||||||
assertSame(bf.getBean("testBean"), bean.getUniqueTestBeanWithDefault());
|
assertSame(bf.getBean("testBean"), bean.getUniqueTestBeanWithDefault());
|
||||||
|
assertEquals(bf.getBean("testBean"), bean.consumeUniqueTestBean());
|
||||||
bf.destroySingletons();
|
bf.destroySingletons();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1337,9 +1341,11 @@ public class AutowiredAnnotationBeanPostProcessorTests {
|
||||||
// expected
|
// expected
|
||||||
}
|
}
|
||||||
assertNull(bean.getOptionalTestBean());
|
assertNull(bean.getOptionalTestBean());
|
||||||
|
assertNull(bean.consumeOptionalTestBean());
|
||||||
assertEquals(new TestBean("default"), bean.getOptionalTestBeanWithDefault());
|
assertEquals(new TestBean("default"), bean.getOptionalTestBeanWithDefault());
|
||||||
assertEquals(new TestBean("default"), bean.getUniqueTestBeanWithDefault());
|
assertEquals(new TestBean("default"), bean.getUniqueTestBeanWithDefault());
|
||||||
assertNull(bean.getUniqueTestBean());
|
assertNull(bean.getUniqueTestBean());
|
||||||
|
assertNull(bean.consumeUniqueTestBean());
|
||||||
bf.destroySingletons();
|
bf.destroySingletons();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1368,7 +1374,15 @@ public class AutowiredAnnotationBeanPostProcessorTests {
|
||||||
catch (NoUniqueBeanDefinitionException ex) {
|
catch (NoUniqueBeanDefinitionException ex) {
|
||||||
// expected
|
// expected
|
||||||
}
|
}
|
||||||
|
try {
|
||||||
|
bean.consumeOptionalTestBean();
|
||||||
|
fail("Should have thrown NoUniqueBeanDefinitionException");
|
||||||
|
}
|
||||||
|
catch (NoUniqueBeanDefinitionException ex) {
|
||||||
|
// expected
|
||||||
|
}
|
||||||
assertNull(bean.getUniqueTestBean());
|
assertNull(bean.getUniqueTestBean());
|
||||||
|
assertNull(bean.consumeUniqueTestBean());
|
||||||
bf.destroySingletons();
|
bf.destroySingletons();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1389,7 +1403,9 @@ public class AutowiredAnnotationBeanPostProcessorTests {
|
||||||
SmartObjectFactoryInjectionBean bean = (SmartObjectFactoryInjectionBean) bf.getBean("annotatedBean");
|
SmartObjectFactoryInjectionBean bean = (SmartObjectFactoryInjectionBean) bf.getBean("annotatedBean");
|
||||||
assertSame(bf.getBean("testBean1"), bean.getTestBean());
|
assertSame(bf.getBean("testBean1"), bean.getTestBean());
|
||||||
assertSame(bf.getBean("testBean1"), bean.getOptionalTestBean());
|
assertSame(bf.getBean("testBean1"), bean.getOptionalTestBean());
|
||||||
|
assertSame(bf.getBean("testBean1"), bean.consumeOptionalTestBean());
|
||||||
assertSame(bf.getBean("testBean1"), bean.getUniqueTestBean());
|
assertSame(bf.getBean("testBean1"), bean.getUniqueTestBean());
|
||||||
|
assertSame(bf.getBean("testBean1"), bean.consumeUniqueTestBean());
|
||||||
assertFalse(bf.containsSingleton("testBean2"));
|
assertFalse(bf.containsSingleton("testBean2"));
|
||||||
bf.destroySingletons();
|
bf.destroySingletons();
|
||||||
}
|
}
|
||||||
|
|
@ -3020,6 +3036,8 @@ public class AutowiredAnnotationBeanPostProcessorTests {
|
||||||
@Autowired
|
@Autowired
|
||||||
private ObjectProvider<TestBean> testBeanFactory;
|
private ObjectProvider<TestBean> testBeanFactory;
|
||||||
|
|
||||||
|
private TestBean consumedTestBean;
|
||||||
|
|
||||||
public TestBean getTestBean() {
|
public TestBean getTestBean() {
|
||||||
return this.testBeanFactory.getObject();
|
return this.testBeanFactory.getObject();
|
||||||
}
|
}
|
||||||
|
|
@ -3036,6 +3054,11 @@ public class AutowiredAnnotationBeanPostProcessorTests {
|
||||||
return this.testBeanFactory.getIfAvailable(() -> new TestBean("default"));
|
return this.testBeanFactory.getIfAvailable(() -> new TestBean("default"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TestBean consumeOptionalTestBean() {
|
||||||
|
this.testBeanFactory.ifAvailable(tb -> consumedTestBean = tb);
|
||||||
|
return consumedTestBean;
|
||||||
|
}
|
||||||
|
|
||||||
public TestBean getUniqueTestBean() {
|
public TestBean getUniqueTestBean() {
|
||||||
return this.testBeanFactory.getIfUnique();
|
return this.testBeanFactory.getIfUnique();
|
||||||
}
|
}
|
||||||
|
|
@ -3043,6 +3066,11 @@ public class AutowiredAnnotationBeanPostProcessorTests {
|
||||||
public TestBean getUniqueTestBeanWithDefault() {
|
public TestBean getUniqueTestBeanWithDefault() {
|
||||||
return this.testBeanFactory.getIfUnique(() -> new TestBean("default"));
|
return this.testBeanFactory.getIfUnique(() -> new TestBean("default"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TestBean consumeUniqueTestBean() {
|
||||||
|
this.testBeanFactory.ifUnique(tb -> consumedTestBean = tb);
|
||||||
|
return consumedTestBean;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue