一 通过配置文件手动加载
说明:这种方式适用于采用Spring框架的独立应用程序,需要程序通过配置文件手工初始化Spring的情况。不难理解对于通过web.xml配置启动的Spring来说也一定是里面实现了此方法。
ApplicationContext ac = new FileSystemXmlApplicationContext("classpath:beans.xml");
ac.getBean("beanId");
二 通过Spring提供的工具类获取ApplicationContext对象
说明:这种方法适合于B/S模式,需要提供ServletContext,局限性比较大,至于以上两个方法区别是前者出错会抛出异常,而后者会返回null。
ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc);
ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc);
ac1.getBean("beanId");
ac2.getBean("beanId");
三 继承自抽象类ApplicationObjectSupport
说明:抽象类ApplicationObjectSupport提供getApplicationContext()方法,可以方便的获取ApplicationContext。
Spring初始化时,会通过该抽象类的setApplicationContext(ApplicationContext context)方法将ApplicationContext 对象注入。
四 继承自抽象类WebApplicationObjectSupport
说明:类似上面方法,调用getWebApplicationContext()获取WebApplicationContext
五 实现接口ApplicationContextAware
说明:实现该接口的setApplicationContext(ApplicationContext context)方法,并保存ApplicationContext 对象。Spring初始化时,会通过该方法将ApplicationContext对象注入。
实际应用
对于需要获取已经启动的bean。我们需要获取bean方法,这时我们可以通过实现接口ApplicationContextAware来获取。
@Component
public class SpringContextHolder implements ApplicationContextAware {
/**
* 静态持有spring上下文对象(bean工厂对象)
*/
private static ApplicationContext factory = null;
/**
* Spring初始化时,会通过该方法将ApplicationContext对象注入。
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextHolder.factory = applicationContext;
}
/**
* 获取spring的bean对象,如果spring上下文加载失败则返回null
*/
@SuppressWarnings("unchecked")
public static <T> T getBean(String beanName) {
return (T) (null == factory ? null : factory.getBean(beanName));
}
/**
* 获取spring的bean对象,如果spring上下文加载失败则返回null
*/
public static <T> T getBean(Class<T> clazz) {
return (null == factory ? null : factory.getBean(clazz));
}
/**
* 获取spring的bean对象,如果spring上下文加载失败则返回null
*/
public static <T> T getBean(String name, Class<T> clazz) {
return (null == factory ? null : factory.getBean(name, clazz));
}
}