package com.softwaremill.common.util.dependency; import javax.enterprise.inject.spi.Bean; import javax.enterprise.inject.spi.BeanManager; import java.lang.annotation.Annotation; import java.util.Arrays; import java.util.Set; /** * @author Adam Warski (adam at warski dot org) */ public class BeanManagerDependencyProvider implements DependencyProvider { private final BeanManager beanManager; public BeanManagerDependencyProvider(BeanManager beanManager) { this.beanManager = beanManager; } @SuppressWarnings({"unchecked"}) @Override public <T> T inject(Class<T> cls, Annotation... qualifiers) { Set<?> beans = beanManager.getBeans(cls, qualifiers); if (beans.size() != 1) { if (beans.size() == 0) { return null; } else { throw new RuntimeException("Multiple beans of class " + cls + " (" + Arrays.toString(qualifiers) + " found: " + beans + "."); } } Bean<T> myBean = (Bean<T>) beans.iterator().next(); return (T) beanManager.getReference(myBean, cls, beanManager.createCreationalContext(myBean)); } @Override public String toString() { return "BeanManagerDependencyProvider{beanManager=" + beanManager + "}"; } }