Close

Spring - Java 8 functions support in ObjectProvider to provide callbacks

[Updated: Nov 1, 2018, Created: Oct 31, 2018]

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();
  }
}
msg: 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());
  }
}
msg: 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();
  }
}
msg: 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());
  }
}
msg: test msg 1

Example Project

Dependencies and Technologies Used:

  • spring-context 5.1.2.RELEASE: Spring Context.
  • JDK 1.8
  • Maven 3.5.4

Spring 5.0 new ObjectProvider methods Select All Download
  • spring-object-provider-function-callbacks
    • src
      • main
        • java
          • com
            • logicbig
              • example
                • GetIfAvailableWithSupplier.java

    See Also