几年前写过一篇如何在一个网站初始化的servlet中使用spring容器中的bean的,传送门(https://blog.csdn.net/wandrong/article/details/44782627)
其实web容器与spring容器只要保证好了加载先后顺序,这个问题就很好解决了,
现在再提出两种方案
第一种
就是你先注册一个servlet,在这个servlet的init方法去加载spring容器,其他servlet的使用顺序在它之后,这样保证了顺序就能使用spring bean,注解也可以用的。
第二种是我现在比较喜欢用的,而且不管是WEB还是非WEB都是通用的。
我们唯一要保证的就是使用spring bean之前,bean工厂是初始化完成的,那既然这样,我们完全可以实现spring的ApplicationListener<ContextRefreshedEvent> 接口来让spring初始化成功后通知我们程序。
以下是我的一个缓存初始化功能,各种缓存实例实现一个接口
/** * 需要更新内存的服务实现此接口 * Created by wengjc on 2018/1/16. */ public interface Refreshable { /** * 刷新缓存 */ void refresh();
public class CacheManager implements ApplicationListener<ContextRefreshedEvent> { private Logger log = Logger.getLogger(CacheManager.class); public List<Refreshable> refreshableList; @Override public void onApplicationEvent(ContextRefreshedEvent event) { if(event.getApplicationContext().getParent() == null && event instanceof ContextRefreshedEvent) { log.info("=====CacheManager begin to load app cache"); if(refreshableList != null) { for(Refreshable refreshable : refreshableList) { try { refreshable.refresh(); } catch (Exception e) { log.error("====CacheManager error:"+e.getMessage()); } } } } } public void setRefreshableList(List refreshableList) { this.refreshableList = refreshableList; } public List getRefreshableList() { return refreshableList; } }