Isso se baseia na resposta de @Pavel, para resolver a possibilidade de o contexto Spring não ser inicializado ao acessar a partir do método getBean estático:
@Component
public class Spring {
private static final Logger LOG = LoggerFactory.getLogger (Spring.class);
private static Spring spring;
@Autowired
private ApplicationContext context;
@PostConstruct
public void registerInstance () {
spring = this;
}
private Spring (ApplicationContext context) {
this.context = context;
}
private static synchronized void initContext () {
if (spring == null) {
LOG.info ("Initializing Spring Context...");
ApplicationContext context = new AnnotationConfigApplicationContext (io.zeniq.spring.BaseConfig.class);
spring = new Spring (context);
}
}
public static <T> T getBean(String name, Class<T> className) throws BeansException {
initContext();
return spring.context.getBean(name, className);
}
public static <T> T getBean(Class<T> className) throws BeansException {
initContext();
return spring.context.getBean(className);
}
public static AutowireCapableBeanFactory getBeanFactory() throws IllegalStateException {
initContext();
return spring.context.getAutowireCapableBeanFactory ();
}
}
A peça importante aqui é o initContext
método. Isso garante que o contexto sempre será inicializado. Mas, observe que initContext
será um ponto de discórdia em seu código, pois ele está sincronizado. Se seu aplicativo for muito paralelizado (por exemplo: o back-end de um site de alto tráfego), essa pode não ser uma boa solução para você.