Điều này được xây dựng dựa trên câu trả lời của @ Pavel , để giải quyết khả năng ngữ cảnh Spring không được khởi tạo khi truy cập từ phương thức getBean tĩnh:
@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 ();
}
}
Phần quan trọng ở đây là initContext
phương pháp. Nó đảm bảo rằng ngữ cảnh sẽ luôn được khởi tạo. Tuy nhiên, hãy lưu ý rằng đó initContext
sẽ là một điểm gây tranh cãi trong mã của bạn vì nó được đồng bộ hóa. Nếu ứng dụng của bạn được song song hóa nhiều (ví dụ: phụ trợ của một trang web có lưu lượng truy cập cao), thì đây có thể không phải là giải pháp tốt cho bạn.