Spring 5.0 added following new methods in ObjectProvider interface which support java.util.function callbacks:
default T getIfAvailable(java.util.function.Supplier<T> defaultSupplier) throws BeansException
The defaultSupplier parameter is a callback for supplying a default object if none is present in the container.
default void ifAvailable(java.util.function.Consumer<T> dependencyConsumer) throws BeansException
The dependencyConsumer parameter is a callback for processing the target object if available (not called otherwise).
default T getIfUnique(java.util.function.Supplier<T> defaultSupplier) throws BeansException
The defaultSupplier parameter is a callback for supplying a default object if no unique candidate is present in the container
default void ifUnique(java.util.function.Consumer<T> dependencyConsumer) throws BeansException
The dependencyConsumer parameter is a callback for processing the target object if unique (not called otherwise).
Examples
Example Bean
public class MsgBean {
private String msg;
public MsgBean(String msg) {
this.msg = msg;
}
public void showMessage() {
System.out.println("msg: " + msg);
}
}
getIfAvailable(defaultSupplier) example
@Configuration
public class GetIfAvailableWithSupplier {
//uncomment @Bean then getIfAvailable will return this instance
//@Bean
MsgBean msgBean() {
return new MsgBean("test msg");
}
public static void main(String[] args) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(GetIfAvailableWithSupplier.class);
ObjectProvider<MsgBean> beanProvider = context.getBeanProvider(MsgBean.class);
MsgBean exampleBean = beanProvider.getIfAvailable(() -> new MsgBean("default msg"));
exampleBean.showMessage();
}
} Outputmsg: default msg
ifAvailable(defaultConsumer) example
@Configuration
public class IfAvailableWithConsumer {
//remove @Bean annotation then getIfAvailable will print nothing
@Bean
MsgBean msgBean() {
return new MsgBean("test msg");
}
public static void main(String[] args) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(IfAvailableWithConsumer.class);
ObjectProvider<MsgBean> beanProvider = context.getBeanProvider(MsgBean.class);
beanProvider.ifAvailable(msgBean -> msgBean.showMessage());
}
} Outputmsg: test msg
getIfUnique(defaultSupplier) example
@Configuration
public class GetIfUniqueWithSupplier {
@Bean
MsgBean msgBean() {
return new MsgBean("test msg 1");
}
//if we remove @Bean here, then 'test msg 1' will print
@Bean
MsgBean msgBean2() {
return new MsgBean("test msg 2");
}
public static void main(String[] args) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(GetIfUniqueWithSupplier.class);
ObjectProvider<MsgBean> beanProvider = context.getBeanProvider(MsgBean.class);
MsgBean exampleBean = beanProvider.getIfUnique(() -> new MsgBean("default msg"));
exampleBean.showMessage();
}
} Outputmsg: default msg
ifUnique(dependencyConsumer) example
@Configuration
public class IfUniqueWithConsumer {
@Bean
MsgBean msgBean() {
return new MsgBean("test msg 1");
}
//if uncomment @Bean annotation here, then nothing will print
//@Bean
MsgBean msgBean2() {
return new MsgBean("test msg 2");
}
public static void main(String[] args) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(IfUniqueWithConsumer.class);
ObjectProvider<MsgBean> beanProvider = context.getBeanProvider(MsgBean.class);
beanProvider.ifUnique(msgBean -> msgBean.showMessage());
}
} Outputmsg: test msg 1
Example ProjectDependencies and Technologies Used: - spring-context 6.1.2 (Spring Context)
Version Compatibility: 5.1.0.RELEASE - 6.1.2 Version compatibilities of spring-context with this example: Versions in green have been tested.
- JDK 17
- Maven 3.8.1
|