在网上搜了一下,写一下我试用的两个方法。
1
2
ApplicationContext ctx=new FileSystemXmlApplicationContext("/application.xml");
//此处的application.xml必须位于系统中一个具体的位置
这个方法貌似只能加载一个XML文件,但是对象内参数的bean配置在其他的xml文件里,所以这个不可以,会报出找不到bean配置的错误。
1
2
ApplicationContext ctx=new ClassPathXmlApplicationContext("classpath:spring/*.xml");
//此处的文件必须位于classpath路径中
这个方法可以加载多个XML文件,但如果项目中多个地方都需要用到的话,不太推荐。
下面一种方法适合在多个地方都用到的情况下,建立一个Application的持有类,实现ApplicationContextAware接口。
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class ApplicationContextHolder implements ApplicationContextAware{
private static Log log = LogFactory.getLog(ApplicationContextHolder.class);
private static ApplicationContext applicationContext;
@SuppressWarnings("all")
public void setApplicationContext(ApplicationContext context) throws BeansException {
if(this.applicationContext != null) {
throw new IllegalStateException("ApplicationContextHolder already holded 'applicationContext'.");
}
this.applicationContext = context;
log.info("holded applicationContext,displayName:"+applicationContext.getDisplayName());
}
public static ApplicationContext getApplicationContext() {
if(applicationContext == null)
throw new IllegalStateException("'applicationContext' property is null,ApplicationContextHolder not yet init.");
return applicationContext;
}
public static Object getBean(String beanName) {
return getApplicationContext().getBean(beanName);
}
public static void cleanHolder() {
applicationContext = null;
}
}
用法是将bean配置到ApplicationContext.xml文件中.这样保证了一个运行环境下只有一个实例,并且也间接保证了只有一个ApplicationContext对象.其他类中如要获取示例,调用
1
ApplicationContextHolder.getBean("beanName")
就可以了.
还需要把ApplicationContextHolder以bean的形式映射到applicationContext.xml中