Ini dibangun berdasarkan jawaban @ Pavel , untuk memecahkan kemungkinan konteks Spring tidak diinisialisasi saat mengakses dari metode getBean statis:
@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 ();
}
}
Bagian penting di sini adalah initContext
metodenya. Ini memastikan bahwa konteks akan selalu diinisialisasi. Tapi, perhatikan bahwa itu initContext
akan menjadi poin pertikaian dalam kode Anda saat disinkronkan. Jika aplikasi Anda sangat diparalelkan (misalnya: bagian belakang situs dengan lalu lintas tinggi), ini mungkin bukan solusi yang baik untuk Anda.