Це спирається на відповідь @ Pavel , щоб вирішити можливість не ініціалізації контексту Spring при доступі з статичного методу getBean:
@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 ();
}
}
Важливим елементом тут є initContext
метод. Це гарантує, що контекст завжди буде ініціалізований. Але, зауважте, це initContext
буде суперечкою у вашому коді, оскільки він синхронізований. Якщо ваша програма сильно паралелізована (наприклад, серверна частина сайту з великим трафіком), це може бути не найкращим рішенням для вас.