package picocli.spring; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; import picocli.CommandLine; /** * @author Thibaud LeprĂȘtre */ public class PicocliSpringFactory implements CommandLine.IFactory { private static final Logger logger = LoggerFactory.getLogger(PicocliSpringFactory.class); private final ApplicationContext applicationContext; public PicocliSpringFactory(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } @Override public K create(Class clazz) throws Exception { try { return getBeanOrCreate(clazz); } catch (Exception e) { logger.warn("Unable to get bean of class {}, using default Picocli factory", clazz); return CommandLine.defaultFactory().create(clazz); } } private K getBeanOrCreate(Class clazz) { try { return applicationContext.getBean(clazz); } catch (Exception e) { return applicationContext.getAutowireCapableBeanFactory().createBean(clazz); } } }