All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.gruelbox.transactionoutbox.Instantiator Maven / Gradle / Ivy

There is a newer version: 6.0.553
Show newest version
package com.gruelbox.transactionoutbox;

import java.util.function.Function;

/**
 * Provides callbacks for the creation and serialization of classes by {@link TransactionOutbox}.
 */
public interface Instantiator {

  /**
   * Creates an {@link Instantiator} which records the class name as its fully qualified name (e.g.
   * {@code com.gruelbox.example.EnterpriseBeanProxyFactoryFactory}) and instantiates instances
   * using reflection and a no-args constructor.
   *
   * 

This is the default used by {@link TransactionOutbox} if nothing else is specified. * * @return A reflection instantiator */ static Instantiator usingReflection() { return ReflectionInstantiator.builder().build(); } /** * Creates an {@link Instantiator} which records the class name as its fully qualified name (e.g. * {@code com.gruelbox.example.EnterpriseBeanProxyFactoryFactory}) and instantiates instances * using the supplied function, which takes the fully qualified name and should return an * instance. * *

This is a good option to use with dependency injection frameworks such as Guice: * *

TransactionOutbox outbox = TransactionOutbox.builder()
   * ...
   * .instantiator(Instantiator.using(injector::getInstance))
   * .build();
* * @param fn A function to create an instance of the specified class. * @return A reflection instantiator */ static Instantiator using(Function, Object> fn) { return FunctionInstantiator.builder().fn(fn).build(); } /** * Provides the name of the specified class. This may be the classes fully-qualified name, or may * be an alias of some kind. This is up to the implementer. * *

Not using the actual class name can be useful in avoiding a case where queued tasks end up * referencing renamed classes following a refactor. It is also useful for DI frameworks such as * Spring DI, which use named bindings by default. * * @param clazz The class to get the name of. * @return The class name. */ String getName(Class clazz); /** * Requests an instance of the named class, where the "name" is whatever is returned by {@link * #getName(Class)}. * *

A common use-case for this method is to return a class from a DI framework such as Guice * (using an injected {code Injector}), but it is perfectly valid to simply instantiate the class * by name and populate its dependencies directly. * * @param name The class "name" as returned by {@link #getName(Class)}. * @return An instance of the class. */ Object getInstance(String name); }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy