Spring中,普通bean可以通过实现ApplicationContextAware得到ApplicationContext,需要重写setApplicationContext和getApplicationContext两个方法。我们知道,是通过setApplicationContext将spring的当前的applicationContext得到,那么spring是什么时候执行setApplicationContext方法的呢?
Spring源码中ApplicationContextAwareProcessor.postProcessBeforeInitialization(),对继承自ApplicationContextAware的bean进行处理,调用其setApplicationContext。而ApplicationContextAwareProcessor是在spring容器start的时候生成的。
在Spring中,实现ApplicationContextAware并覆盖setApplicationContext方法, 就可以获得ApplicationContext了。
public class SpringApplicationContextHolder implements ApplicationContextAware { public static ApplicationContext ctx; public void setApplicationContext(ApplicationContext ctx) throws BeansException { SpringApplicationContextHolder.ctx = ctx; } }
public class SpringApplicationContextHolder implements ApplicationContextAware { public static ApplicationContext ctx; public void setApplicationContext(ApplicationContext ctx) throws BeansException { SpringApplicationContextHolder.ctx = ctx; } public static IXXXDao getXXXDao() { return ctx.getBean(IXXXDao.class); } }