Das Singleton Entwurfsmuster ist jedem Entwickler bekannt. Es dient dazu, dass ein Objekt, welches häufig benötigt wird und/oder teuer zu erstellen ist, nur einmal erzeugt und in der JVM bereitgehalten wird. Im Bereich des JEE übernimmt z.B. der CDI Container die saubere Erstellung. Bei Spring unterstützt uns der Spring Context. Doch wie binden wir eine Klasse ein, die wir aus einer Library importiert haben? Nachfolgend ein Beispiel anhand des Dozer Mappers.

Nutzen wir plain Java könnte das Singleton wie folgt erstellt werden. Wir nutzen einen Wrapper bzw. eine Factory:

/**
* creating a dozer mapper is expensive. Therefore we do it once here.
* For some explanations or discussions have a look at stackoverflow. * * @author Manuel Schmid (BITSchmid) */ public final class DozerWrapper { /** object is used to sync the mapper creation code-block */ private static final Object lock = new Object(); /** the singleton instance of our wrapper; use volatile here! */ private static volatile Mapper mapper; /** * returns a single instance of {@link DozerBeanMapper} and is threadsafe. * * @return see: {@link DozerBeanMapper}; never NULL */ public static Mapper getInstance() { if (mapper == null) { // avoid sync penalty if possible synchronized (lock) { // sync the private static object (for mutex) if (mapper == null) { // you have to do this inside the sync again (Murphys law :-D ) final DozerBeanMapper dozerBeanMapper = new DozerBeanMapper(); dozerBeanMapper.setMappingFiles(Collections.singletonList("your-dozer-mapping-config.xml")); mapper = dozerBeanMapper; } } } return mapper; } }

Mit Spring ist es natürlich noch etwas einfacher:

@Configuration
public class AppConfig{

  @Bean
  @Primary
  @Scope(BeanDefinition.SCOPE_SINGLETON) // default by the way ;-)
  public Mapper getMapper() {

    final DozerBeanMapper dozerBeanMapper = new DozerBeanMapper();
    dozerBeanMapper.setMappingFiles(Collections.singletonList("your-dozer-mapping-config.xml"));
    return dozerBeanMapper;
  }
  [...]
}